【问题标题】:Expressjs set cookies in middlewareExpressjs 在中间件中设置 cookie
【发布时间】:2015-01-03 02:05:30
【问题描述】:

我有一个小问题。

我正在使用 MaxMind 获取用户所在的国家/地区,并以这种方式将国家/地区存储在 cookie 中:

exports.countryCookie = function(req, res, next) {
  if (req.cookies.country === undefined) {
    var ip = (req.header('X-Forwarded-For') || req.connection.remoteAddress).toString();
    if (ip !== undefined) {
        satelize.satelize({ip: ip}, function(err, geoData) {
          if (err) return next();
          res.cookie('country', geoData.country);
          next();
        });
    } else {
        next();
    }
  } else {
    next();
  }
};

我的家庭控制器:

exports.index = function(req, res) {
    var country = req.cookies.country;

    console.log(country);

    if (country !== undefined) {
      // do something...
    } else {
      // do something else...
    }
}

路由:

app.get('/', myMiddleware.countryCookie, HomeController.index);

问题是:

第一次加载时console.log(country)undefined,但浏览器上设置了 Cookie...

刷新时不再是undefined。 如何在第一次加载页面时从 homeController 读取 cookie?

似乎中间件与 homeController 一起被触发,它错过了 cookie...

【问题讨论】:

    标签: node.js cookies express


    【解决方案1】:

    您可以在调用next() 之前执行req.cookies.country = geoData.country;

    【讨论】:

    • 嗯,它有效。但是...我能知道它为什么有效吗?即使我删除了res.cookie('country', ...);,它也可以在不保存cookie的情况下工作......也许我错过了关于Express的一些非常重要的东西......顺便感谢您的回答。
    • 它可以工作,因为那是您的索引控制器正在寻找的。​​span>
    • 好的...但是 res.cookie 应该设置一个cookie并且 req.cookies 应该获取那个cookie...按照您的解决方案,看起来我可以使用 req.cookie 设置一个cookie,就像设置一个全局变量并在任何地方使用它,而无需从浏览器 cookie 中获取任何数据...
    • res.cookie() 仅设置传出的Set-Cookie 标头。 req.cookies 在客户端发出下一个请求之前不会获取这些设置的 cookie。
    猜你喜欢
    • 2016-07-10
    • 2017-12-07
    • 1970-01-01
    • 2017-06-22
    • 2013-11-04
    • 2013-09-01
    • 1970-01-01
    • 2015-02-27
    • 2019-10-21
    相关资源
    最近更新 更多