Nodejs mongoose session 字段正确,但无法匹配
Nodejs mongoose session 字段正确,但无法匹配
定义用户数据模型 // var Schema = mongoose.Schema ; var UserSchema = new Schema({ username : String , password : String }); exports.User = mongoose.model(‘User’,UserSchema) ; 功能描述:在登陆页面,输入正确用户名和密码后,页面跳转。 遇到的问题: 刚开始用户名和密码都正确,是可以正常跳转的;但是当重复执行”登陆–退出“后,会突然发生:输入用户名和密码即时正确也无法和数据库匹配,导致之后用户名和密码都正确也无法登陆。 使用Robomongo查看数据库,并未发现异常!请问这是什么原因? ps:密码和用户名在数据库和输入时,都未发生有空格之类的低级错误! ps:2014/12/17,另外当用户名和密码成功匹配时,会将用户信息存入session //===================== exports.userLogin = function (req, res) { UserModel.find( {username: req.body.username}, function (err,doc) { … req.session.user = doc[0];//当发生如上错误时,此处打印req.session.user.username 正常 res.redirect(’/’); }); } //===================== app.get(’/’, function (req, res) { if (! req.session.user) { //当发生如上错误时,此处打印req.session.user.username 为TypeError: Cannot read property ‘username’ of undefined res.redirect(’/login’); } else { res.redirect(’/XX’); } }); //===================== var sessionstore = require(‘session-mongoose’)(express); var store = new sessionstore({ url: “mongodb://XXX/XX”, interval: 120000 }); …是session出问题了?但是问题在哪里了? session应该如何配置?
Node.js Mongoose Session 字段正确,但无法匹配
定义用户数据模型
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
username: String,
password: String
});
module.exports = mongoose.model('User', UserSchema);
功能描述
在登录页面,输入正确用户名和密码后,页面跳转。
遇到的问题
刚开始用户名和密码都正确,可以正常跳转。但是当重复执行“登录 - 退出”后,输入正确的用户名和密码也无法与数据库匹配,导致后续无法登录。
分析与解决
首先,确保你已经正确配置了Session存储。你可以使用connect-mongo
库来简化Session的管理:
npm install connect-mongo express-session --save
然后,在你的应用中进行如下配置:
const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const mongoose = require('mongoose');
const app = express();
mongoose.connect('mongodb://localhost/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: false,
store: new MongoStore({ mongooseConnection: mongoose.connection })
}));
app.post('/login', async (req, res) => {
const { username, password } = req.body;
try {
const user = await UserModel.findOne({ username, password });
if (user) {
req.session.user = user;
res.redirect('/');
} else {
res.status(401).send('Invalid credentials');
}
} catch (error) {
console.error(error);
res.status(500).send('Internal server error');
}
});
app.get('/', (req, res) => {
if (!req.session.user) {
res.redirect('/login');
} else {
res.redirect('/XX');
}
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
问题分析
- Session 存储:确保你使用的是MongoDB作为Session存储。使用
connect-mongo
库可以简化这一过程。 - 密码验证:在实际应用中,不要直接在数据库中存储明文密码。应该使用哈希算法(如bcrypt)来加密密码。
- 错误处理:确保你在处理错误时有足够的日志记录,以便快速定位问题。
通过上述配置和改进,你应该能够解决Session相关的问题,并确保登录功能正常工作。
求解答,以及session相关的资料!
根据你提供的描述,问题可能出现在以下几个方面:
-
Session 配置:确保你正确配置了 session 中间件。
express-session
是常用的 session 中间件,需要正确设置存储引擎。 -
异步操作:确保在处理异步操作时,如数据库查询,正确处理回调或使用 Promise。
-
Session 存储:如果你使用 MongoDB 作为 session 存储,确保
session-mongoose
正确安装并配置。
示例配置
const express = require('express');
const session = require('express-session');
const sessionMongoose = require('session-mongoose')(express);
const mongoose = require('mongoose');
// 连接 MongoDB
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true, useUnifiedTopology: true });
// 定义用户模型
const UserSchema = new mongoose.Schema({
username: String,
password: String
});
const UserModel = mongoose.model('User', UserSchema);
// 设置 session 中间件
app.use(session({
secret: 'your_secret_key',
resave: false,
saveUninitialized: true,
store: new sessionMongoose({
url: "mongodb://localhost/session",
interval: 120000
})
}));
// 登录功能
exports.userLogin = async (req, res) => {
try {
const user = await UserModel.findOne({ username: req.body.username });
if (user && user.password === req.body.password) {
req.session.user = user;
res.redirect('/');
} else {
res.status(401).send('Invalid username or password');
}
} catch (error) {
console.error(error);
res.status(500).send('Server error');
}
};
// 主页路由
app.get('/', (req, res) => {
if (!req.session.user) {
res.redirect('/login');
} else {
res.redirect('/XX');
}
});
const app = express();
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
- Session 中间件:使用
express-session
和session-mongoose
配置 session 存储。 - 用户模型:定义并连接到 MongoDB 数据库。
- 登录逻辑:确保在找到用户后将其存储在 session 中。
- 主页逻辑:检查 session 中是否有用户信息,如果没有则重定向到登录页面。
这样可以确保 session 正确配置,并且登录逻辑能够正确处理用户的 session 信息。