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应该如何配置?


3 回复

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');
});

问题分析

  1. Session 存储:确保你使用的是MongoDB作为Session存储。使用connect-mongo库可以简化这一过程。
  2. 密码验证:在实际应用中,不要直接在数据库中存储明文密码。应该使用哈希算法(如bcrypt)来加密密码。
  3. 错误处理:确保你在处理错误时有足够的日志记录,以便快速定位问题。

通过上述配置和改进,你应该能够解决Session相关的问题,并确保登录功能正常工作。


求解答,以及session相关的资料!

根据你提供的描述,问题可能出现在以下几个方面:

  1. Session 配置:确保你正确配置了 session 中间件。express-session 是常用的 session 中间件,需要正确设置存储引擎。

  2. 异步操作:确保在处理异步操作时,如数据库查询,正确处理回调或使用 Promise。

  3. 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');
});

解释

  1. Session 中间件:使用 express-sessionsession-mongoose 配置 session 存储。
  2. 用户模型:定义并连接到 MongoDB 数据库。
  3. 登录逻辑:确保在找到用户后将其存储在 session 中。
  4. 主页逻辑:检查 session 中是否有用户信息,如果没有则重定向到登录页面。

这样可以确保 session 正确配置,并且登录逻辑能够正确处理用户的 session 信息。

回到顶部