Сессия не определена

Я пишу проверку политики, которая через некоторое время уничтожает сеанс.

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)

я настраиваю этот сеанс, чтобы показать пользователю какое-то сообщение на странице входа в систему, но я не знаю, почему паруса ведут себя так.

есть ли способ справиться с этим сценарием, а также, пожалуйста, дайте мне знать причину, почему это происходит.

Спасибо


person Ahsan Hussain    schedule 07.08.2015    source источник


Ответы (1)


Это экспресс.

Сеанс.destroy()

Уничтожает сессию, удаляя req.session, будет перегенерирован следующий запрос.

Как указано в журнале предупреждений, перед ошибкой был вызван req.session.destroy();.

Вы можете использовать req.session.regenerate() для ожидаемого поведения.

Session.regenerate()

Чтобы восстановить сеанс, просто вызовите метод, после завершения новый экземпляр SID и сеанса будет инициализирован в req.session.

person Alexis N-o    schedule 07.08.2015