0

我们有一个route& amiddleware这样的:

当我们这样做时:

//middleware
router.use((req, res, next) => {

    // check header or url parameters or post parameters for token
    let token = req.body.token || req.query.token || req.headers['x-access-token'],


        // verifies secret and checks exp
        jwt.verify(token, config.secret, (err, decoded) => {
            if (err) {
                return res.json({
                    success: false,
                    message: 'Failed to authenticate token.'
                });
            } else {
                // if everything is good, save to request for use in other routes
                res.locals.test = "test";
                req.somevariable = "variable1";

                console.log("res.locals.test inside middleware ", JSON.stringify(res.locals.test));
                console.log("req.somevariable inside middleware ", JSON.stringify(req.somevariable));

                next();

            }
        });

    next();
});

//TestRoute
router.get('/TestRoute', (req, res) => {

    console.log("res.locals.test outside middleware ", JSON.stringify(res.locals.test));
    console.log("req.somevariable outside middleware ", JSON.stringify(req.somevariable));

});

req.somevariable和的值res.locals.testundefined外面middleware

当我们这样做时:

//middleware
router.use((req, res, next) => {

    res.locals.test = "test";
    req.somevariable = "variable1";

    console.log("res.locals.test inside middleware ", JSON.stringify(res.locals.test));
    console.log("req.somevariable inside middleware ", JSON.stringify(req.somevariable));

    next();

});

//TestRoute
router.get('/TestRoute', (req, res) => {

    console.log("res.locals.test outside middleware ", JSON.stringify(res.locals.test));
    console.log("req.somevariable outside middleware ", JSON.stringify(req.somevariable));


});

req.somevariable和的值在res.locals.test外部可用middleware

这里有什么问题?

4

1 回答 1

1

res.locals.VARIABLENAME = req.user

VARIABLENAME(无论您将其设置为什么变量)在您使用.ejs或使用该变量进行动态渲染时都可能显示为未定义,您可能会收到错误,例如您的变量名称未定义。

这是一个奇怪的res.locals:当你想使用你设置为res.locals渲染的变量名时,你必须req.user在你的函数中定义渲染文件!

后端:res.locals.currentUser = req.user

//THIS FUNCTION WILL RENDER PERFECTLY LETTING ME USE currentUser in my .ejs file
 upgradeForm(req, res, next) {
    let saved = req.user;
    if(req.user){
      res.render("users/upgrade");
    } else{
      req.flash("notice", "You've successfully signed in!");
      res.redirect("/");
    }
  }

然而

//THIS FUNCTION WILL SAY currentUser is UNDEFINED IN MY .ejs file
 upgradeForm(req, res, next) {
    if(req.user){
      res.render("users/upgrade");
    } else{
      req.flash("notice", "You've successfully signed in!");
      res.redirect("/");
    }
  }

除了工作函数渲染req.user设置为变量(您甚至不必使用该变量)之外,没有代码差异。我花了 9 个小时来解决这个问题,但现在你知道了!

于 2020-01-11T03:41:11.803 回答