Javascript 快速会话未在页面之间持久化

Javascript 快速会话未在页面之间持久化,javascript,node.js,session,express,Javascript,Node.js,Session,Express,我正在尝试保存会话,但当我保存会话时,该会话在下一个请求中不存在 当我向/login发送ajax请求时,我使用req.session.username设置会话,然后我发回一个对象,该对象显示{success:true}。然后刷新页面,如果会话中存在用户名,则显示用户页面,否则显示主页 每次我在/刷新页面时,它总是显示登录名,即使在我将请求发送到/login并设置会话后也是如此。为什么会话没有保存 let express = require('express') let sessions = re

我正在尝试保存会话,但当我保存会话时,该会话在下一个请求中不存在

当我向
/login
发送ajax请求时,我使用
req.session.username
设置会话,然后我发回一个对象,该对象显示
{success:true}
。然后刷新页面,如果会话中存在用户名,则显示用户页面,否则显示主页

每次我在
/
刷新页面时,它总是显示登录名,即使在我将请求发送到
/login
并设置会话后也是如此。为什么会话没有保存

let express = require('express')
let sessions = require('express-session')
let bodyParser = require('body-parser')
let app = express()

app.use(sessions({
  secret: 'connection-id',
  resave: true,
  saveUninitialized: true,
  cookie: { maxAge: 60000 }
}))

app.use(bodyParser.json())

app.get('/', (req, res) => {
  if (req.session.username) {
    res.render('pages/home')
  } else {
    res.render('pages/index')
  }
}).post('/login', (req, res) => {
  if (req.xhr) {
    req.session.username = req.body.username
    res.send({ success: true })
  } else {
    res.sendStatus(500)
  }
})
客户端:

let response = await fetch('/login', {
  method: 'post',
  headers: {
    'X-Requested-With': 'XMLHttpRequest',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: new FormData((document.getElementById('login-form'))).toJson()
})

let json = await response.json()
if (json.success) {
  window.location.href = '/'
}
当我发出Ajax请求时,我会返回以下标题:

set-cookie:connect.sid=s%3At25S_TmjwL6vVkhyJ9LuKIyy4EH1LTcy.Zu4fBpMibfjmMofxQI5K%2FmgAYHWFqQf3x8HPzcQbDH4; Path=/; Expires=Sun, 23 Jul 2017 15:29:26 GMT; HttpOnly

编辑 因此,在注释完代码中的所有内容并慢慢取消注释和测试行之后,我发现这不起作用:

req.session.username = req.body.username // body.username Contains a string
但是,这确实有效:

req.session.username = 'Billy'

我不知道它为什么这样做。有什么建议吗?

所以我解决了我的问题,它与服务器无关,只是ajax
fetch()
请求

我需要添加选项
credentials:'include'
,如下所示:

let response = await fetch('/login', {
  method: 'post',
  credentials: 'include',
  headers: {
    'X-Requested-With': 'XMLHttpRequest',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: new FormData(document.getElementById('login-form')).toJson()
})

您是否正在保存cookie、令牌,以及客户端生成的任何内容,以及它是否与每个请求一起发送?否,我不是。我正在使用fetch发送信息。请检查控制台是否保存/发送了cookie。确实会创建一个名为
connect.sid
的cookie,并且该值看起来是加密的。我添加了一张图片,查看express会话代码(index.js第96行),这是cookie的默认名称。所以这是正确的。