Не удается сохранить пользователя в сеансе Express.js - PullRequest
0 голосов
/ 28 августа 2018

У меня есть этот код:

    app.post('/api/command', function (req, res, next) {
    var clientCommand = req.body.command;

    console.log("ClientCommand: ", clientCommand);
    if (!req.session.step || req.session.step === EMAIL) {

        // find user in db with email
        users.findOne({email: clientCommand}, function (err, result) {
            if (err) {
                return console.log("error: ", err);
            }
            console.log("result: ", result.email);

            // if user exists add user in session
            if (result != null) {
                req.session.user = result;
            }
        });//.catch(console.log);

        console.log("session outside: ", req.session.user);
        // change step to password
        req.session.step = PASSWORD;

    }

Проблема в том, что я хочу получить доступ к req.session.user за пределами users.findOne (...). Но вывод:

ClientCommand:  example@gmail.com
session outside:  undefined

Любая помощь будет оценена.

P.S. Также мне хотелось бы узнать, как работает экспресс-сессия и как она хранит данные в файлах cookie (или на стороне сервера).

1 Ответ

0 голосов
/ 28 августа 2018

Findone - асинхронная команда, из-за которой вы получаете неопределенное значение.

Даже если вы заметите «сессия снаружи:» идет первым только после этого «result:» появится консоль.

Так что, если вам нужно переместить код внутри findone или использовать пользовательское промежуточное ПО, где вы можете выполнить запрос.

используйте этот тип кода в приложении js перед вызовом маршрутов

app.use(function(req,res,next){
    users.findOne({email: clientCommand}, function (err, result) {
            if (err) {
                return console.log("error: ", err);
            }
            console.log("result: ", result.email);

            // if user exists add user in session
            if (result != null) {
                req.session.user = result;
                next(); // After setting user ,  route will call 
            }else{
                next(); // will allow to go to route even if no user found
            }

        });//.catch(console.log);

})

если вы хотите вызвать его по определенному URL, тогда используйте

app.use ("[ваш URL]", функция (req, res, next) {

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...