nodejs sessionStore与cloudant app.use执行不一致

时间:2016-11-02 14:51:46

标签: node.js session cloudant

我正在为nodeJS构建一个cloudant sessionStore,并且被app.use语句的内容所困扰。以下两个app.use语句的不同之处仅在于,一个函数调用了包含会话的会话,但这导致了非常不同的行为。

示例1:

app.use('/login*', session( {
store: sessionStore,
secret: sessionSecret, resave: false, saveUninitialized: true,
cookie: {secure: true, maxAge:24*60*60*1000},
genid: function (req) {return uuid.v4()}
}));

在第一个示例中,调用sessionStore例程来创建和存储新的会话ID

示例2:

app.use('/login*', function () {session( {
store: sessionStore,
secret: sessionSecret, resave: false, saveUninitialized: true,
cookie: {secure: true, maxAge:24*60*60*1000},
genid: function (req) {return uuid.v4()}
})});

在示例2中,将会话语句包装在函数def中只会调用sessionStore.on('disconnect'),然后调用sessionStore.on('connect')。

我想我错过了一些非常明显的东西,但我很难过。两个问题:

  1. 当放置在匿名函数中时,为什么session()执行会有所不同?

  2. 这是正常的,我的sessionStore.on('connect')是否应设置为处理这种情况?

2 个答案:

答案 0 :(得分:1)

在第二个示例中,您的匿名函数调用'session'但不返回

Express会话是中间件,所以第一次使用是正确的。

您可能还对Cloudant的预建会话商店感兴趣:https://www.npmjs.com/package/connect-cloudant

这将使您的代码:

. . . var app = express(); app.use(session({ store: cloudantStore, secret: 'your secret', cookie: {maxAge:24*60*60*1000} })); app.get('login', function(req, res) { console.log('my session is', req.session); res.send({ok: true}); });

答案 1 :(得分:0)

@Glynn:谢谢,你提供了部分解决方案。我回复了您的回复中的原始方法,但发现我仍然遇到页面响应问题。服务器一直挂着。在构建cloudant会话管理器时,其中一个必需的例程是sessionStore.save,我错误地将其指定为:

sessionStore.save(sid, session, callback)

事实证明,当express-session调用sessionStore.save()时,它使用:

sessionStore.save(callback)

修复解决了所有问题。谢谢你的帮助。