Не удается сохранить экспресс-сессию в NodeJs

Я пытаюсь сохранить имя пользователя пользователя в экспресс-сеансе. Он сохраняет переменную в сеансе, но возвращает undefined при следующем запросе к маршруту. Однако проблема связана только с маршрутом POST.

С запросом GET я могу сохранить переменную сеанса, и она не будет уничтожена при дальнейших запросах. Я думаю, что я должен делать что-то неправильно. Я попробовал метод save() для POST, но все же он сохраняется только в первый раз, а в следующий раз он исчезает.

Вот код:

app.use(session({
  secret: 'some secret',
  resave: true,
  saveUninitialized: true,
  cookie: {
    maxAge: 36000000,
    httpOnly: false
  },
}));

ПОЛУЧИТЬ МАРШРУТ РАБОТАЕТ.

app.get("/test", function(req, res, next){
    if(!req.session.name){
        req.session.name = "vikas kumar";
    } else {
        console.log(req.session.name);
    }
    res.end();
});

app.use(function (req, res, next) {
  var userName = req.session.userName;
  // console.log(req.session.userName);
  if(userName && userName != 'undefined'){
    res.send({status: "success", value: userName});
  } else {
    if(req.path == '/checkIfLoggedIn'){
        res.send({status: "error", message: "Session ended."});
    } else {
        next('route');
    }
  }
});

СЛЕДОВАНИЕ МАРШРУТА СОХРАНЯЕТ СЕАНС ​​ТОЛЬКО ОДИН РАЗ.

app.post('/getProfile', function (req, res, next) {
    console.log("Session", req.session.userName, req.session.name);
    if(typeof req.session.userName != 'undefined'){
        var userName = req.session.userName;
    } else {
        var userName = req.body.userName;
    }
   connectionPool.getConnection(function (err, connection) {
        if (err) {
            res.send({status: "error", message: err});
        } else {
        connection.query("SELECT * FROM cs_chat.users WHERE username=?", [userName], function (err, rows, fields) {
            if(rows.length==1){
                // console.log(">>>", req.session.userName);
                req.session.userName = userName;
                req.session.save();
                // console.log("<<<", req.session.userName);
                next();
            }else{
                res.send({status: "error", message: "Sorry, you're not registered."});
            }
            connection.release();

        });

        }
    });
}, function (req, res) {
    connectionPool.getConnection(function (err, connection) {
        if (err) {
            res.send({status: "error", message: err});
        } else {
            req.session.username = req.body.userName;
            req.session.save();
        connection.query("SELECT usr.username, usr.name, tsn.sender, CASE WHEN tsn.unseen is not null THEN tsn.unseen ELSE 0 END as unseen, tsn.receiver FROM users usr LEFT JOIN (SELECT sender, receiver, SUM(CASE WHEN seen = 0 THEN 1 ELSE 0 END) AS unseen FROM messages WHERE receiver = ? GROUP BY sender , receiver) tsn ON usr.username = tsn.sender where usr.username!=?", [req.body.userName, req.body.userName], function (err, rows, fields) {
            if(rows.length>0){
                res.send({status: "success", values: rows});
            }else{
                res.send({status: "success", values: []});
            }
            connection.release();
        });

        }
    });
});

Я делаю что-то неправильно?


person Vikas    schedule 23.06.2017    source источник
comment
ну, в вашем запросе POST вы не сохраняете сеанс, чтобы позже сформируйте его, чтобы имя пользователя можно было получить из него позже на других ваших ограниченных маршрутах. См. аналогичный SO вопрос   -  person warl0ck    schedule 23.06.2017
comment
Но я уже написал save() метод?   -  person Vikas    schedule 23.06.2017
comment
Прежде всего, не могли бы вы сказать мне, почему вы используете два function, когда вы можете сделать вышеперечисленное только в одной функции, подключение к connectionPool просто увеличит время отклика сервера, а в первом function(req, res, next) почему вы используете next() это не так? требуется.   -  person warl0ck    schedule 23.06.2017
comment
и поскольку это javascript, вы проверяете равенство с помощью == вместо этого вы должны проверять его с помощью ===, это может быть одной из причин. вроде if(rows.length==1) должно быть if(rows.length===1)   -  person warl0ck    schedule 23.06.2017


Ответы (1)


Поскольку это Javascript, вы должны проверять качество с помощью === вместо ==, и для лучшего времени отклика разрывать соединение, а затем снова подключаться к нему просто не нужно, когда у вас есть соединение с connectionPool, просто запросите его дважды, а затем отпустите соединение .

Вот пример измененного запроса app.post().., он должен работать:

    app.post('/getProfile', function (req, res, next) {
    console.log("Session", req.session.userName, req.session.name);
    var userName = (req.session.userName !== undefined) ? req.session.userName : req.body.userName;

    connectionPool.getConnection(function (err, connection) {
        if (err) {
            res.send({ status: "error", message: err });
        } else {
            connection.query("SELECT * FROM cs_chat.users WHERE username=?", [userName], function (err, rows, fields) {
                if (rows.length === 1) {
                    req.session.userName = userName;
                    req.session.save();
                } else {
                    res.send({ status: "error", message: "Sorry, you're not registered." });
                }
            });
            connection.query("SELECT usr.username, usr.name, tsn.sender, CASE WHEN tsn.unseen is not null THEN tsn.unseen ELSE 0 END as unseen, tsn.receiver FROM users usr LEFT JOIN (SELECT sender, receiver, SUM(CASE WHEN seen = 0 THEN 1 ELSE 0 END) AS unseen FROM messages WHERE receiver = ? GROUP BY sender , receiver) tsn ON usr.username = tsn.sender where usr.username!=?",
                [req.body.userName, req.body.userName],
                function (err, rows, fields) {
                    if (rows.length > 0) {
                        res.send({ status: "success", values: rows });
                    } else {
                        res.send({ status: "success", values: [] });
                    }
                });
            connection.release();
        }
    });
});
person warl0ck    schedule 23.06.2017
comment
не уверен, что это полностью решит проблему, но это одна из проблем точно - person warl0ck; 24.06.2017
comment
Во время почтового запроса вы видите req.session.userName в выводе консоли? - person warl0ck; 25.06.2017
comment
Оставьте пост, на самом деле он даже не работает для запроса GET. Я объяснил свою проблему здесь снова. Пожалуйста, проверьте: stackoverflow.com/questions/44745218/ - person Vikas; 25.06.2017