node.js - 使用express-session时req.session未定义

标签 node.js mongodb express express-session

以下是我的 session 设置代码:

import app from './server.js';
import dotenv from 'dotenv';
import mongoose from 'mongoose';
import session from 'express-session';
import {default as connectMongo} from 'connect-mongo';

dotenv.config();

const port = process.env.PORT || 8000;
const MongoURI = process.env.BLOG_DB_URI;
const MAX_AGE = process.env.MAX_AGE;

mongoose
  .connect(MongoURI, { 
    useNewUrlParser: true,
    useUnifiedTopology: true
  })
  .then((client) => {
    const mongoDBstore = connectMongo.create({
      mongoUrl: MongoURI,
      client: client,
      collection: "mySessions" 
    });
    console.log('session: ' + session);

    app.use(
      session({
        secret: process.env.SESSION_SECRET, 
        resave: false, 
        saveUninitialized: false, 
        store: mongoDBstore,
        cookie: {
          path: '/',
          httpOnly: false,
          maxAge: MAX_AGE,
          sameSite: false
        }
      })
    );
    
    app.listen(port, () => console.log(`listening on port: ${port}`));
    })
  .catch((err) => console.log(err));

下面是我的用户登录代码:

static async loginUser(req, res, next) {
        try{
            const user = await User.findOne({userName: req.body.userName});
            !user && res.status(400).json('Please enter correct username');

            const valid = await bcrypt.compare(req.body.password, user.password);
            !valid && res.status(400).json('Invalid Password');

            const sessUser = {
                id: user._id,
                userName: user.userName,
                email: user.email
            };
            console.log('req.session: ' + req.session);
            req.session.user = sessUser; 
            
            res.status(200).json(sessUser);
        } catch(err) {
            res.status(500).json(`login error: ${err}`);
        }
    }

现在,当我转到登录路线时:“/api/user/login” 并尝试登录现有用户,我收到错误:

login error: TypeError: Cannot set property 'user' of undefined

在打印 req.session 的值时,它显示为未定义。 有人可以告诉我我可能做错了什么吗? 提前致谢。

最佳答案

该问题是由于我声明中间件的顺序造成的。 app.use(session(...)) 必须出现在 app.use('/api/users/login', function(...)) 之前。否则 res.session 将保持未定义状态。

关于node.js - 使用express-session时req.session未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72099030/

相关文章:

javascript - 如何将全栈应用程序部署到heroku或netlify?哪些文件是必需的?

node.js - 使用 onesignal REST API 将移动应用程序推送通知发送到存储在数据库中的设备 token

node.js - TypeScript:使用ZeroMQ ROUTER/DEALER时占用大量内存

mongodb - 使用 FluentMongo 删除和更新文档

node.js - 当父文档可能不存在时更新 MongoDB 子文档

node.js - Express-session mongodb session 不持久

node.js - 验证在带有 Mongo 的 Node 中的 Mongoose 中不起作用

node.js - 如何在当前更新的 mongodb 网站上获取标准 URI 连接字符串(不带 srv)?

javascript - 如何使用 Uglify.js 为 Express.js 中的每个 View 连接 JavaScript

javascript - 允许代理服务器接受随机数路由