编辑-我不再认为这是一个开发环境问题,因为同样的事情仍然存在于生产环境中。
首先,感谢您在这方面花费的时间-我知道这是一个常见的问题,但我已经仔细阅读了这么多的问题,并尝试应用了这么多的解决方案,但都无济于事。
总而言之,我目前有一个React前端,它正在向我的Express服务器发送带有Fetch API的请求。我想使用快速会话来保存登录的用户信息,以便会话在用户使用应用程序时使用和验证。
我有这个奇怪的问题,每次发送新请求时,我浏览器中应用程序选项卡中的cookie都会被设置为全新的内容。我可能理解错了,但我认为这应该在整个会议中保持一致,但事实似乎并非如此。这使得每次我调用新请求时,req.session完全重置,没有任何东西。
以下是我的应用程序中的一些代码:
快速server.js[快速会话和cors的设置]
app.use(cors({
credentials: true
}))
const session = require('express-session')
// Middleware for creating sessions and session cookies.
// A session is created on every request
app.use(session({
secret: 'tis a secret mate',
cookie: {
expires: 3000, // expires in 15 mins
httpOnly: true,
secure: false,
},
// Session saving options
saveUnintialized: false, // don't save the initial session if the session object is unmodified (i.e the user did not log in)
resave: true, // don't resave a session that hasn't been modified
store: MongoStore.create({
mongoUrl: process.env.MONGODB_URI_SESSIONS
})
}))
app.use(function (req, res, next) {
console.log('SESSION LOGGING MIDDLEWARE')
console.log(req.session);
next()
});
app.use((req, res, next) => {
res.header('Access-control-Allow-Origin', 'http://localhost:3000');
res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept, Authorization"
);
res.header('Access-Control-Allow-Credentials', true);
next();
});
编辑-登录路径
app.post('/api/users/login', async (req, res) => {
// pull out the body
const body = req.body
// pull out the username and password
const username = body.username
const password = body.password
User.findByUsernamePassword(username, password)
.then(user => {
// if we find the user, the users information to the session to retain all that information
// will create a function to ensuree that the session exists to make sure that we are logged in
req.session.user = user
req.session.username = user.username
req.session.save()
console.log(req.session)
res.send({ user: req.session.user })
})
.catch(error => {
res.status(400).send()
});
})
前端获取调用在下面的代码中,我将登录和检查会话调用粘贴到各自的endpoint。本质上,check会话调用只返回会话中的内容,而login调用应该登录用户并将用户添加到req中。一场使用者
登录后,我尝试运行检查会话,看看用户是否在会话中,但不是每次都在。我还注意到,我的应用程序选项卡中的Chrome cookie更改为其他内容。
export const login = (username, password, setUser) => {
const obj = {
username: username,
password: password
}
const request = new Request(`${API_HOST}/api/users/login`, {
method: "POST",
credentials: "include",
body: JSON.stringify(obj),
headers: {
"Content-Type": "application/json"
}
})
// send the request
const promise = fetch(request)
.then(res => {
if (res.status === 200) {
return res.json();
}
})
.then(json => {
// if the user exists, setUser to user
console.log("USER PRE:", json.user)
if (json.user !== undefined) {
console.log("USER: ", json.user)
setUser(json.user)
return json.user
}
})
.catch(error => {
console.log(error);
})
return promise
}
export const checkSession = () => {
const url = `${API_HOST}/api/users/check-session`
fetch(url, {
credentials: 'include'
})
.then(res => {
if (res.status === 200) {
console.log('200')
console.log(res.json())
} else {
console.log(res)
}
})
// .then(json => {
// if (json) {
// setUser(json)
// }
// })
.catch(error => {
console.log(error);
});
}
我尝试过的事情
其他可能有用的注释
谢谢你的时间,我知道这是一个超长的问题。请让我知道,如果你想帮忙,我还可以提供什么帮助来澄清!
如果在不同的主机上运行后端和前端,则可能存在CORS问题。您还说您在“应用程序”选项卡中检查了cookie,但是如果您还没有尝试查看“网络”选项卡中的请求和响应cookie头,您应该检查它们以进一步诊断问题。cookie应该在身份验证请求上设置,并且应该包含在随后的请求中。
问题内容: 我有登录功能 此函数用于将变量保存到会话中, 但是当新请求检查用户是否登录时 然后返回总是“注销”,因为会话已更改。我使用Redis来存储会话,我认为这是Redis的错误,因为当我停止使用Redis时,可以,请帮帮我! 问题答案: 最好的处理方式是始终让Express处理它(如果可以的话)。 https://flaviocopes.com/express-sessions/(更新了会话
每当我试图进入我的repo-git时,它都会同时请求
本文向大家介绍快速了解Python开发环境Spyder,包括了快速了解Python开发环境Spyder的使用技巧和注意事项,需要的朋友参考一下 Spyder简介 Spyder (前身是 Pydee) 是一个强大的交互式 Python 语言开发环境,提供高级的代码编辑、交互测试、调试等特性,支持包括 Windows、Linux 和 OS X 系统。 ● 菜单栏(Menu bar):显示可用于操纵Sp
我正在使用异步套接字用C#编写一个多客户端/服务器应用程序。连接上的每个客户端发送10个项目。问题是,当快速启动大量客户机时,每个客户机发送的条目都少于10个,有时什么也不发送,服务器只记录它们的连接。
Web 开发中经常需要处理 HTTP 请求、重定向和会话等诸多事务,相应地,Flask 也内建了一些常见的对象如 request, session, redirect 等对它们进行处理。 请求对象 request HTTP 请求方法有 GET、POST、PUT 等,request 对象也相应地提供了支持。举个例子,假设现在我们开发一个功能:用户注册。如果 HTTP 请求方法是 POST,我们就注册
本文向大家介绍Linux下快速搭建php开发环境,包括了Linux下快速搭建php开发环境的使用技巧和注意事项,需要的朋友参考一下 一、Linux下快速搭建php开发环境 1.安装XAMPP for Linux XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包,使用XAMPP可快速搭建PHP开发环境。下载链接:https://www.apachefriends