关于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这里却没有正常跳转,只是刷新了当前页面。 不知道问题出在哪了?


4 回复

针对您提到的“关于Nodejs中session存入mongodb的问题”,让我们一起深入分析并解决这个问题。

首先,您已经正确地设置了express-session中间件,并且使用了connect-mongo模块来将session存储到MongoDB。这一步是正确的。但是,问题可能出现在重定向的部分。

问题分析

  1. 检查路由配置:确保/home路由存在并且可以被访问。
  2. 检查重定向状态码:默认情况下,res.redirect发送一个HTTP 302临时重定向响应。如果客户端没有正确处理这个状态码,可能会导致页面只刷新而不是跳转。
  3. 错误处理:确保在重定向之前没有其他错误发生。

示例代码

让我们先回顾一下您的代码,并进行一些改进:

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

解释

  1. 数据库连接:使用mongoose连接到MongoDB数据库。
  2. session配置:设置express-session中间件,使用connect-mongo将session数据存储到MongoDB。
  3. 路由:定义了两个路由/login/home。当用户访问/login时,会将用户信息存储到session中,并重定向到/home
  4. 重定向处理:在/home路由中检查session中的用户信息,如果没有找到则重定向回登录页。

通过以上改进,应该能够解决您遇到的重定向问题。如果问题仍然存在,请检查浏览器控制台是否有任何错误信息或网络请求失败的情况。


忘记说了 express版本是4.2

还是喜欢 JWT 扔给client就不用存了

根据你的描述,res.redirect('/home') 没有正常执行,这可能是由于一些常见的原因,比如中间件顺序、错误处理等。我们可以通过以下几点来排查和解决这个问题。

可能的原因

  1. 中间件顺序:确保 express-session 和路由中间件的顺序正确。
  2. 错误处理:确保没有其他中间件或路由拦截了请求。
  3. 会话存储问题:确保 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}`);
});

解释

  1. 中间件顺序:确保 express-session 在路由之前被调用。
  2. MongoDB 连接字符串:确保 MongoDB 的连接字符串正确无误。
  3. 错误处理:添加适当的错误处理中间件以捕获任何潜在的错误。

调试步骤

  1. 检查日志:查看服务器日志是否有任何错误信息。
  2. 验证会话数据:确保会话数据确实被存储到 MongoDB 中。
  3. 简化路由:尝试简化路由逻辑,逐步排除问题。

如果问题仍然存在,请提供更多的错误信息以便进一步调试。

回到顶部