会话没有定义sailsjs

我正在写一个策略checkSession,基本上会在一段时间后破坏会话。

checkSession.js (policies/checksession.js)

 var moment = require('moment'); function checkLastActivity(req) { if (!req.session.lastActivity) { return false; // no session. } else { return true; } } function setActivity(req) { req.session.lastActivity = moment(new Date()).format(); return true; } function updateActivity(req, res, updated) { req.session.lastActivity = moment(new Date()).format(); updated(null, { isdestroted: 0 }); } function checkIdleTime(req, idleTime) { try { var lastActivityTime = moment(req.session.lastActivity).format(); var currentActivityTime = moment(new Date()).format(); timeIdle = moment.utc(moment(currentActivityTime).diff(moment(lastActivityTime))).format("HH:mm:ss"); minutestimeIdle = moment.duration(timeIdle).asMinutes().toFixed(2); idleTime(null, minutestimeIdle); } catch (e) { idleTime(e, null); } } function destroyActivity(req, res, destroyed) { try { req.session.destroy(); sails.log.info("***********************session is expired for user *****************"); destroyed(null, { isdestroted: 1, redirectCode: 200, redirectView: '/login/' }); } catch(e) { destroyed(e, null); } } module.exports = function isSession(req, res, next) { cleanParamsService.cleanPrm(req); async.waterfall([ function(callback) { callback(null, checkLastActivity(req)); }, function(isLastActivity, callback) { if (isLastActivity) { checkIdleTime(req, function(err, timeIdle) { if (minutestimeIdle > sails.config.session_timeout) { /*if user is being idle*/ destroyActivity(req, res, function(err, destroyed) { sails.log.warn('User was idle since' + minutestimeIdle + ', sessions are destroyed'); callback(null, destroyed); }) } else { updateActivity(req, res, function(err, updated) { callback(null, updated); }); } }) } else { updateActivity(req, res, function(err, updated) { callback(null, updated); }); } } ], function(err, result) { if (result) { if (result.isdestroted == 0) { return next(); } else { return res.redirect(result.redirectCode, result.redirectView); } } else { sails.log.error('err:', err); return res.badRequest(); } }); }; 

现在,如果我改变它

 var moment = require('moment'); function checkLastActivity(req) { if (!req.session.lastActivity) { return false; // no session. } else { return true; } } function setActivity(req) { req.session.lastActivity = moment(new Date()).format(); return true; } function updateActivity(req, res, updated) { req.session.lastActivity = moment(new Date()).format(); updated(null, { isdestroted: 0 }); } function checkIdleTime(req, idleTime) { try { var lastActivityTime = moment(req.session.lastActivity).format(); var currentActivityTime = moment(new Date()).format(); timeIdle = moment.utc(moment(currentActivityTime).diff(moment(lastActivityTime))).format("HH:mm:ss"); minutestimeIdle = moment.duration(timeIdle).asMinutes().toFixed(2); idleTime(null, minutestimeIdle); } catch (e) { idleTime(e, null); } } function destroyActivity(req, res, destroyed) { try { req.session.destroy(); sails.log.info("***********************session is expired for user *****************"); destroyed(null, { isdestroted: 1, redirectCode: 200, redirectView: '/login/' }); } catch (e) { destroyed(e, null); } } module.exports = function isSession(req, res, next) { cleanParamsService.cleanPrm(req); async.waterfall([ function(callback) { callback(null, checkLastActivity(req)); }, function(isLastActivity, callback) { if (isLastActivity) { checkIdleTime(req, function(err, timeIdle) { if (minutestimeIdle > sails.config.session_timeout) { /*if user is being idle*/ destroyActivity(req, res, function(err, destroyed) { sails.log.warn('User was idle since' + minutestimeIdle + ', sessions are destroyed'); callback(null, destroyed); }) } else { updateActivity(req, res, function(err, updated) { callback(null, updated); }); } }) } else { updateActivity(req, res, function(err, updated) { callback(null, updated); }); } }, function(resp, callback) { if (resp.isdestroted == 0) { req.fresh; req.session.isdestroted = false; callback(null, resp); } else { req.fresh; req.session.isdestroted = true; callback(null, resp); } } ], function(err, result) { if (result) { if (result.isdestroted == 0) { return next(); } else { return res.redirect(result.redirectCode, result.redirectView); } } else { sails.log.error('err:', err); return res.badRequest(); } }); }; 

应用程序触发错误,我设置req.session.isdestroted = true / false,错误是

 warn: User was idle since0.38, sessions are destroyed debug: Lowering sails... C:\Users\Vbase002\Desktop\CC\Website\api\policies\checkSession.js:83 req.session.isdestroted = true; ^ TypeError: Cannot set property 'isdestroted' of undefined at C:\Users\Vbase002\Desktop\CC\Website\api\policies\checkSession.js:83:41 at fn (C:\Users\Vbase002\Desktop\CC\Website\node_modules\sails\node_modules\ async\lib\async.js:579:34) at Immediate._onImmediate (C:\Users\Vbase002\Desktop\CC\Website\node_modules \sails\node_modules\async\lib\async.js:495:34) at processImmediate [as _immediateCallback] (timers.js:367:17) 

我正在设置这个会话在login页面显示一些消息给用户,但我不知道为什么帆是这样的行为。

有没有办法处理这种情况,也请让我知道这是为什么发生的原因。

谢谢

这是一个expression的行为 。

Session.destroy()

销毁会话,删除req.session,将重新生成下一个请求。

正如你的警告日志所示, req.session.destroy(); 在错误之前被调用。

你可以使用req.session.regenerate()来获得预期的行为。

Session.regenerate()

重新生成会话只需调用该方法,一旦完成一个新的SID和Session实例将在req.session初始化。