Node.js 登录到一个Express应用程序会破坏另一个(同一服务器)中的会话

Node.js 登录到一个Express应用程序会破坏另一个(同一服务器)中的会话,node.js,session,express,passport.js,connect-mongo,Node.js,Session,Express,Passport.js,Connect Mongo,我有两个独立的Express 4.x应用程序运行在同一台服务器上(不同端口),共享一个MongoDB实例。它们都使用不同的数据库,具有不同的会话机密 我可以单独登录到应用程序A或B而不会出现问题。我的疗程维持,一切都很好。但是,如果我先登录到A,然后再登录到B,我在A中的会话将被销毁(反之亦然) 两个应用程序具有几乎相同的本地身份验证。他们的serializeUser和deserializeUser非常原始(紧跟着Passport文档几乎到了发球台) 似乎当登录A然后B时,req.session

我有两个独立的Express 4.x应用程序运行在同一台服务器上(不同端口),共享一个MongoDB实例。它们都使用不同的数据库,具有不同的会话机密

我可以单独登录到应用程序A或B而不会出现问题。我的疗程维持,一切都很好。但是,如果我先登录到A,然后再登录到B,我在A中的会话将被销毁(反之亦然)

两个应用程序具有几乎相同的本地身份验证。他们的
serializeUser
deserializeUser
非常原始(紧跟着Passport文档几乎到了发球台)

似乎当登录A然后B时,
req.session.passport
被破坏,导致
req.user
在应用程序A上无法正确序列化,会话被视为无效


我开始认为这与两个应用程序运行在同一台机器上(因此是域)有关,只是端口不同。

express session:Node.js中express的简单会话中间件。要使用它,你必须像这样包含这个包

var session = require('express-session');
要安装此软件包,请运行以下命令:

$ npm install express-session
如何在Express中使用此选项,给出了以下代码:

app.use(session({
  secret: 'secretkey',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: true }
}));
默认情况下,要在响应中设置(并从请求中读取)的会话ID cookie的名称为
connect.sid
。要覆盖此内容,请使用以下命令:

app.use(session({
  name: 'cookiename',
  secret: 'secretkey',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: true }
}));
有关更多参考信息,请参阅此链接-

注意:-将您的
express session
语句放在应用程序app.js的
app.use(passport.session())
语句之前

希望这将有助于解决您的疑问

const mongoose=require('mongoose'),
时间戳=需要('mongoose-timestamp');
var Schema=mongoose.Schema;
const Sessions=newmongoose.Schema({
到期日:{
类型:字符串,
默认值:“
},
会议:{
类型:Schema.Types.Mixed,
默认值:{}
}
},{集合:'会话'})
Sessions.plugin(时间戳)
module.exports=mongoose.model('sessions',sessions);
//需要模式
const Sessions=require(‘Sessions’);
//按id删除会话
Sessions.remove({“session.user.\u id”:user.\u id}

).exec(console.log)
在不同的端口上运行时,必须为不同项目中的每个会话指定不同的名称。默认情况下,对于所有项目,它都将是
connect.sid

例如:- 项目在端口3000中运行-
项目B在5000港运行-


默认情况下,同时运行这些项目时,它们将具有相同的会话名称,因此在身份验证中会发生冲突。因此,您必须为每个项目使用不同的会话名称。

我认为您在两个应用程序中使用的会话cookie名称相同。使用不同的名称创建两个cookie,并希望一切正常。@VickyR如何定义会话cookie名称?其中一个配置选项中是否有属性?您在此处编写的会话的代码是什么更新的。@Erik,我在回答中更新了“如何在express会话中覆盖默认cookie名称”。