简体   繁体   English

将变量传递给 express.js 中 req 中的下一个中间件

[英]passing variable to next middleware in req in express.js

I am trying to pass variable to the next middlewares through the req object.我正在尝试通过req object 将变量传递给下一个中间件。 getting some data from database and passing that data to request for next middlewares to use.从数据库中获取一些数据并将该数据传递给请求下一个中间件使用。

User.findone({ _id: someId })
    .then(user => { req.user = user })
    .catch(err => {  })

After that then and catch block i am using next() .在那之后然后捕获块我正在使用next() Therefore for the next middlewares i am getting req.user undefined.因此,对于下一个中间件,我得到 req.user 未定义。 but if i pass the next() function in the then block after req.user = user like .then(user=> {req.user = user; next()}) than i am getting req.user a valid user object to use for the next middlewares.但是如果我在req.user = user like .then .then(user=> {req.user = user; next()})之后通过next() function ,那么我得到req.user一个有效用户 object 到用于下一个中间件。 what is the reason for this behaviour??这种行为的原因是什么?

That's because the User.findOne function is asynchronous.那是因为User.findOne function 是异步的。 The result of that function is only known in the then block. function 的结果仅在then块中已知。

const middleware = (req, res, next) => {
    User.findOne({ _id: someId })
        .then(user => {
            req.user = user;
        })
        .catch(err => { });
    next(); // If you put next() here, the request will go straight to the next middleware without waiting for User.findOne() to complete.
};
const middleware = (req, res, next) => {
    User.findOne({ _id: someId })
        .then(user => {
            req.user = user;
            next(); // Putting next() here is correct
        })
        .catch(err => {
            next(err); // Remember to handle error to avoid hanging the request
        });
};

then... is called after the User.findone promise resolves. then...User.findone promise 解析后调用。 Thus, if you put next() outside of then , it will be called before then .因此,如果您将next()放在then之外,它将在then之前调用。

You could read more details at promise-basics您可以在promise-basics阅读更多详细信息

Alternatively try to use async-await as it looks more straightforward.或者尝试使用async-await ,因为它看起来更简单。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM