【问题标题】:Why is req.somevariable and res.locals not working with jwt callbacks?为什么 req.somevariable 和 res.locals 不能与 jwt 回调一起使用?
【发布时间】:2017-09-30 04:05:09
【问题描述】:

我们有一个 route 和一个 middleware 像这样:

当我们这样做时:

//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.somevariableres.locals.test 的值在middleware 之外是undefined

当我们这样做时:

//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.somevariableres.locals.test 的值在 middleware 之外可用。

这里有什么问题?

【问题讨论】:

  • 您在第一个中间件示例中调用 next() 两次 - 这可能会导致意外结果
  • @Nosyara 哦,这就是问题所在。我删除了它并让它工作。谢谢!!

标签: javascript node.js express ecmascript-6 express-jwt


【解决方案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 个小时解决了这个问题,但现在你知道了!

【讨论】:

    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2018-03-09
    • 2021-06-14
    相关资源
    最近更新 更多