【问题标题】:ExpressJS client-sessions don't save sessionExpressJS 客户端会话不保存会话
【发布时间】:2017-12-03 23:09:54
【问题描述】:

我想在我的 Express 后端使用 client-sessions 模块。所以我已经安装了模块并将其设置为与 Express 一起使用,如下所示:

var sessions      = require('client-sessions');
app.use(sessions({
    cookieName: Constants.CLIENT_SESSION_NAME, // pi_client_session
    secret: Constants.CLIENT_SESSION_SECRET, // some long string here
    duration: Constants.CLIENT_SESSION_LIFETIME // 24 * 60 * 60 * 1000;
}));

但是,由于某种原因,每次请求都是空的。示例如下:

router.get('/auth', function(req, res, next) {
    console.log("CLIENT SESSION BEFORE: " + JSON.stringify(req[Constants.CLIENT_SESSION_NAME]));
    req[Constants.CLIENT_SESSION_NAME].test = "saved";
    console.log("CLIENT SESSION AFTER: " + JSON.stringify(req[Constants.CLIENT_SESSION_NAME]));
    return res.json({ sessionSaved: true});
}

这是我每次得到的输出:

CLIENT SESSION BEFORE: {}
CLIENT SESSION AFTER: {"test":"saved"}

我尝试过使用 Google Chrome、Opera。同样的结果。

我的设置是这样的:从 localhost:3000 到 localhost:3001 的 ReactJS 应用代理,这是我的快速后端。 我已经尝试直接请求与 Postman 表达,并且它正常保存了会话。所以问题肯定出在从反应到表达和返回的代理中。 我在 react 端的 package.json 文件如下(我没有包含依赖项):

"scripts": {
    "build-css": "node-sass-chokidar src/ -o src/",
    "watch-css": "npm run build-css && node-sass-chokidar src/ -o src/ --watch --recursive",
    "start-js": "react-scripts start",
    "start": "npm-run-all -p watch-css start-js",
    "build": "npm run build-css && react-scripts build",
    "eject": "react-scripts eject"
  },
  "proxy": "http://localhost:3001"

所以问题是,我怎样才能使用这样的代理获取客户端会话?

【问题讨论】:

  • 您确定客户端请求正确传递了凭据吗?您应该检查 a) 客户端是否收到会话 cookie 和 b) 客户端是否在后续请求中发送该 cookie。另外,请看这里:developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/…
  • 我忘了说,我使用的是 fetch(),而不是 XMLHttpRequest。但是感谢您向我指出关键字凭据:)。我会尝试用 fetch 检查它
  • 同样适用,只是略有不同:developer.mozilla.org/en-US/docs/Web/API/Fetch_API/…
  • 哇!非常感谢您为我指明正确的方向!我已将 {credentials: 'include' } 添加到我的 fetch() 参数中,现在一切正常:) 您可以在此处输入您的回复作为答案,我会接受它

标签: javascript node.js session express


【解决方案1】:

由于您的 React 应用程序运行在与后端不同的源上,因此您需要明确告诉 fetch 在每个请求中传递凭据(如 cookie):

fetch('http://your-backend', {
  credentials: 'include'  
}).then(...)

【讨论】:

    猜你喜欢
    • 2017-02-25
    • 2018-09-26
    • 2011-06-14
    • 2017-04-01
    • 1970-01-01
    • 2015-12-28
    • 2014-07-24
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多