关于Nodejs中session存入mongodb的问题
关于Nodejs中session存入mongodb的问题
var session = require(‘express-session’); var MongoStore = require(‘connect-mongo’)(session);
app.use(session({ secret: ‘secretkey’, store: new MongoStore({ db: ‘sessiondb’ }) }));
=======
使用的地方: req.session.user=user; res.redirect(’/home’);
页面运行后,session的确存入了mongodb,但是res.redirect这里却没有正常跳转,只是刷新了当前页面。 不知道问题出在哪了?
针对您提到的“关于Nodejs中session存入mongodb的问题”,让我们一起深入分析并解决这个问题。
首先,您已经正确地设置了express-session
中间件,并且使用了connect-mongo
模块来将session存储到MongoDB。这一步是正确的。但是,问题可能出现在重定向的部分。
问题分析
- 检查路由配置:确保
/home
路由存在并且可以被访问。 - 检查重定向状态码:默认情况下,
res.redirect
发送一个HTTP 302临时重定向响应。如果客户端没有正确处理这个状态码,可能会导致页面只刷新而不是跳转。 - 错误处理:确保在重定向之前没有其他错误发生。
示例代码
让我们先回顾一下您的代码,并进行一些改进:
const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const mongoose = require('mongoose');
const app = express();
// 连接MongoDB
mongoose.connect('mongodb://localhost/sessiondb', {
useNewUrlParser: true,
useUnifiedTopology: true
});
app.use(session({
secret: 'secretkey',
resave: false,
saveUninitialized: true,
store: new MongoStore({
mongooseConnection: mongoose.connection
})
}));
app.get('/login', (req, res) => {
// 假设用户登录成功
req.session.user = { username: 'testUser' };
res.redirect('/home');
});
app.get('/home', (req, res) => {
if (req.session.user) {
res.send(`Hello ${req.session.user.username}`);
} else {
res.redirect('/login');
}
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
- 数据库连接:使用
mongoose
连接到MongoDB数据库。 - session配置:设置
express-session
中间件,使用connect-mongo
将session数据存储到MongoDB。 - 路由:定义了两个路由
/login
和/home
。当用户访问/login
时,会将用户信息存储到session中,并重定向到/home
。 - 重定向处理:在
/home
路由中检查session中的用户信息,如果没有找到则重定向回登录页。
通过以上改进,应该能够解决您遇到的重定向问题。如果问题仍然存在,请检查浏览器控制台是否有任何错误信息或网络请求失败的情况。
忘记说了 express版本是4.2
还是喜欢 JWT 扔给client就不用存了
根据你的描述,res.redirect('/home')
没有正常执行,这可能是由于一些常见的原因,比如中间件顺序、错误处理等。我们可以通过以下几点来排查和解决这个问题。
可能的原因
- 中间件顺序:确保
express-session
和路由中间件的顺序正确。 - 错误处理:确保没有其他中间件或路由拦截了请求。
- 会话存储问题:确保 MongoDB 连接和会话存储配置正确。
示例代码
const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const app = express();
// 配置会话中间件
app.use(session({
secret: 'secretkey',
resave: false,
saveUninitialized: true,
store: new MongoStore({
url: 'mongodb://localhost:27017/sessiondb' // 确保数据库连接字符串正确
})
}));
// 示例路由
app.get('/', (req, res) => {
req.session.user = { name: 'John Doe' };
res.redirect('/home');
});
app.get('/home', (req, res) => {
res.send(`Hello ${req.session.user.name}`);
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
解释
- 中间件顺序:确保
express-session
在路由之前被调用。 - MongoDB 连接字符串:确保 MongoDB 的连接字符串正确无误。
- 错误处理:添加适当的错误处理中间件以捕获任何潜在的错误。
调试步骤
- 检查日志:查看服务器日志是否有任何错误信息。
- 验证会话数据:确保会话数据确实被存储到 MongoDB 中。
- 简化路由:尝试简化路由逻辑,逐步排除问题。
如果问题仍然存在,请提供更多的错误信息以便进一步调试。