【已解决】求助!Nodejs中req.session

【已解决】求助!Nodejs中req.session

在写 Node.js 开发指南中的例子, 当要往 MongoDM 中存放新用户时,报错:

TypeError: Cannot set property 'user' of undefined

代码中指向这行:

req.session.user = newUser; 

app.js 中,中间件是这样设置的:

app.configure(function(){ 
 app.set('views', __dirname + '/views'); 
 app.set('view engine', 'ejs'); 
 app.use(express.bodyParser()); 
 app.use(express.methodOverride()); 
 app.use(express.cookieParser()); 
 app.use(express.session({ 
 secret: settings.cookieSecret, 
  store: new MongoStore({ 
   db: settings.db 
  }) 
 })); 
 app.use(app.router); 
 //app.use(express.router(routes))
 app.use(express.static(__dirname + '/public')); 
});

看起来像 session 中间件没有配对,但是又不知道哪里出了问题,求助!


5 回复

根据你的描述,你遇到了一个 TypeError,错误信息为 Cannot set property 'user' of undefined。这个错误通常意味着你在尝试给一个未定义的对象设置属性。

分析问题

从你提供的代码片段来看,你在使用 Express 框架,并且已经配置了 session 中间件。问题出在 req.session.user = newUser; 这一行,这意味着 req.session 可能没有正确初始化或设置。

解决方案

  1. 确保 session 中间件顺序:确保 express.session() 中间件在路由处理之前被调用。
  2. 检查 session 存储配置:确保 MongoDB 存储配置正确无误。

示例代码

以下是一个完整的示例代码,展示如何正确配置和使用 session:

const express = require('express');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const app = express();

// 设置视图引擎和静态文件目录
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.static(__dirname + '/public'));

// 配置中间件
app.use(cookieParser());
app.use(session({
    secret: 'your_secret_key',
    resave: false,
    saveUninitialized: true,
    store: new MongoStore({
        url: 'mongodb://localhost:27017/your_database_name'
    })
}));

// 配置路由
app.get('/', (req, res) => {
    req.session.user = { username: 'exampleUser' };
    res.send('Session set successfully!');
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  • 中间件顺序:确保 cookieParser()session() 在路由之前被调用。
  • MongoDB 存储配置:确保 MongoStore 的配置正确,包括数据库 URL。
  • 会话设置req.session 是一个对象,你可以直接设置属性如 req.session.user

通过以上步骤,你应该能够解决 TypeError: Cannot set property 'user' of undefined 错误。如果问题仍然存在,请检查 MongoDB 是否正常运行并且可以连接。


console.log(newUser);//undefined

是这样吗

已经解决了.

app.use(express.session({ 
 secret: settings.cookieSecret, 
  store: new MongoStore({ 
   db: settings.db 
  }) 
})); 

要写在

app.use(app.router); 

之前.

我也碰到这个问题了, 原来真是顺序的问题, 谢谢楼主

根据你提供的信息,错误 TypeError: Cannot set property 'user' of undefined 表明 req.session 可能没有正确初始化。你需要确保在使用 req.session 之前已经成功设置了 session 中间件。

首先,确认你的 express-sessionconnect-mongo 包已经安装:

npm install express-session connect-mongo --save

然后,检查你的 app.js 文件,确保 session 中间件配置正确。以下是修改后的 app.js 示例:

var express = require('express');
var MongoStore = require('connect-mongo')(express);
var settings = {
    cookieSecret: 'your_cookie_secret',
    db: 'your_database_name'
};

var app = express();

app.configure(function(){
    app.set('views', __dirname + '/views');
    app.set('view engine', 'ejs');
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.cookieParser());
    app.use(express.session({
        secret: settings.cookieSecret,
        store: new MongoStore({ 
            db: settings.db 
        })
    }));
    app.use(app.router);
    app.use(express.static(__dirname + '/public'));
});

// 路由处理
app.post('/register', function(req, res) {
    var newUser = { /* 新用户数据 */ };
    req.session.user = newUser;
    res.send('注册成功');
});

app.listen(3000);

如果 req.session 仍然为 undefined,请确保在请求处理函数中正确加载了 session 中间件,并且请求路径在 app.use(app.router) 之后。

如果你使用的是较新的 Express 版本(4.x),请替换 express.session()express-session,并更新代码如下:

const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);

const settings = {
    cookieSecret: 'your_cookie_secret',
    db: 'your_database_name'
};

const app = express();

app.use(express.urlencoded({ extended: true }));
app.use(express.json());

app.use(session({
    secret: settings.cookieSecret,
    store: new MongoStore({ 
        db: settings.db 
    }),
    resave: false,
    saveUninitialized: true
}));

app.post('/register', (req, res) => {
    const newUser = { /* 新用户数据 */ };
    req.session.user = newUser;
    res.send('注册成功');
});

app.listen(3000);

通过以上步骤,你应该能够正确地设置和使用 req.session

回到顶部