Tengo el siguiente código:
const app = require("express")(); const middleware = (obj) => (req, res, next) => { next(); }; app.get( "/users", middleware({ id: req.login.id, }) ); app.listen(9999, () => console.log("test running on port 9999"));Cuando ejecuto la aplicación me da el siguiente error:
ReferenceError: req no está definido
Sé que req no está definido en el middleware, pero mi pregunta es quién ejecuta el middleware incluso antes de enviar cualquier solicitud (al iniciar la aplicación).
porque lo despiden? quien lo invoca y como prevenir eso?
Si tiene este código, por ejemplo, no arrojará ningún error:
const y = (propName) => console.log(propName); const x = () => y({ req: req.login.id }); porque x nunca se llama. pero en mi aplicación Express, ¿por qué se lee req.login.id al iniciar la aplicación?
Segun tengo entendido, tienes un error en la linea 10:
app.get( // 7 "/users", // 8 middleware({ // 9 id: req.login.id, // 10 }) // 11 ); // 12Hay una diferencia entre su código y su ejemplo: en su código, ejecuta la aplicación. get(...) , por lo que la función get(...) tiene sus propios argumentos. El segundo argumento es middleware(...) , que también es una función. La función de middleware (...) no tiene que ejecutarse, y tiene razón en eso, pero el middleware (...) también es un argumento (para la función principal), pero como función, debería definirse con sus propios argumentos. Significa que no puede poner allí lo que quiera dentro de los corchetes de la función de middleware (...) como argumentos. Tienes que poner allí solo cosas definidas. Por favor, no mezcle el comando javascript con la definición de la función . Entonces, la diferencia entre su código y su ejemplo dado es que en su ejemplo solo tiene algunas cosas no definidas en el cuerpo de la función, pero no como argumento. Puede estar seguro de eso, cuando escribirá su mismo ejemplo de otra manera, que es lo mismo:
const y = (propName) => { // 1 console.log(propName) // 2 }; // 3 const x = () => { // 4 y({ req: req.login.id }) // 5 }; // 6Como puede ver en la quinta línea, solo tiene algunas cosas en el cuerpo, por eso nunca se ejecutó, pero en su código tenía algunas cosas que se ejecutaron.
PD: vi alguna respuesta, así que pensé que podría ser útil escribir aquí un código alternativo también. Puede modificar su código de esta manera, donde el requisito se usa dentro del cuerpo del middleware:
const app = require("express")(); const middleware = (obj) => (req, res, next) => { // use req.login.id here... next(); }; app.get("/users", middleware); app.listen(9999, () => console.log("test running on port 9999"));Porque está llamando a una función para definir el middleware. Debe usarlo como se muestra a continuación.
const app = require("express")(); const middleware = (obj) => (req, res, next) => { const {login:{id}} = req.params; if(id){ // Things to do... } next(); }; app.get( "/users", middleware );