【问题标题】:Can fs.writeFile called in a file routed to express, middlewared by session, delete the session cookie?fs.writeFile 可以在路由到表达的文件中调用,由会话中间件删除会话 cookie 吗?
【发布时间】:2021-07-24 12:19:41
【问题描述】:

我使用 express 将一个 js 文件路由到主 js 文件,它是路由器中间件。此外,每个路径都由会话进行中间件。身份验证后,只有在 req.session.loggedIn 存在时才会收到的 get 请求,将在登录后的每个请求上执行。

但是对于 put 请求,它会执​​行一次,然后会被身份验证器阻止,身份验证器是两个请求中的中间件。

当注释掉 fs.writeFile 块时,cookie 仍然如预期的那样,并且 put 请求被执行了多次。

fs.writeFile 会弄乱 cookie 吗?

这是有问题的块:

fs.writeFile('./data/tasks.json', stringed, (err)=>{
        if(err){return console.log(err)}
        console.log('req.session from tasks put:',req.session)

    }, ()=>res.send(`Successfuly added task. `))

这是验证中间件:

const validator = (req, res, next)=>{

console.log('req.session in validator:',req.session)

if(!req.session.loggedIn){
    return res.status(401).send('Please log in.')
}
    next()}

这是会话中间件:

app.use(session({
secret: ';klmkljhjkhn;jk',
cookie: {
        maxAge: 6000065456468476813541684864764561231,
    httpOnly: true,
    secure: false,
},
saveUninitialized: true,
resave: true,
}))

这是路由中间件:

app.use('/tasks', validator, require('./routes/tasks'))

【问题讨论】:

  • 您能展示一下应用程序是如何组成的吗? fs.writeFile 到底在哪里使用,在哪条路线上使用?另外,为什么要向 fs.writeFile 传递 2 个回调?
  • github.com/OrenSayag/jb_28_hw 我认为额外的回调可能会解决问题
  • 嘿,我已经发布了答案。我试图通过写一篇文章来详细说明这个话题,但它仍在进行中。如果有任何帮助,这里有一个粗略的草稿,您可能会觉得有用 - 抱歉,如果我现在无法将它弄得更好:github.com/rkaw92/articles/blob/master/sessions/Article.md

标签: node.js express session filesystems middleware


【解决方案1】:

您在 cmets 中链接到的代码 in your repository 不容易显示您描述的问题。我能够通过 POST 成功登录并添加 2 个任务,然后将它们读回,而不会丢失会话数据。

您可能在 2 个回调中遇到了一些与时间相关的问题:fs.writeFile() 需要 1 个回调,因此 other 回调从未被执行;我无法验证这一点,因为 git 中的代码确实包含这个确切的语句。由于express-session 仅在发送响应时才保存会话,而这里并没有发生,所以很可能超时 - 所以很可能:

  • 您发起了 POST /tasks 的请求 - 它加载了空会话(未登录
  • 然后您登录,响应完成
  • 最后,对 POST /tasks 的第一个请求结束了 - 并且 express-session 重新保存了(空)会话,因此它覆盖了您登录的会话

如果您禁用resave: true,则可以避免这种情况。

总结一下:fs.writeFile 本身不会引起会话问题,但会导致请求覆盖会话状态,尤其是在存在以下情况时:

  • 回调错误
  • 写得很长
  • 重新保存:真

【讨论】:

  • 感谢文章的通知!我的问题的解决方案是禁用 nodemon,它会在每次文件更改时杀死服务器,这正是 fs.writeFile 所做的。我松了一口气!
【解决方案2】:

我的问题的解决方案是禁用 nodemon,它会在每次文件更改时终止服务器,这正是 fs.writeFile 所做的。我松了一口气!

【讨论】:

    猜你喜欢
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2015-11-04
    相关资源
    最近更新 更多