I have the following code:
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"));
When I run the app it gives the following error:
ReferenceError: req is not defined
I know that req is not defined in the middleware, but, my question is, who runs the middleware before even sending any request (on app launch).
why it gets fired? who invokes it? and how to prevent that?
If you have this code, for example, no error will be thrown:
const y = (propName) => console.log(propName);
const x = () => y({ req: req.login.id });
because x is never called. but in my express app, why does it read req.login.id on app launch?
Según tengo entendido, tienes un error en la línea 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, ejecutó app. 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"));Because you are calling a function to define the middleware. You should use it as shown below.
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 );