2017-06-23 29 views
0

我試圖在快速會話中保存用戶的用戶名。它在會話中保存變量,但在下一次路由請求時返回undefined。但是,問題僅限於POST路由。無法在NodeJs中保存快速會話

使用GET請求,我可以保存會話變量,並且不會在進一步的請求中被銷燬。我想我一定在做錯事。我嘗試使用save()方法進行POST,但仍然只能保存第一次和下次它消失。

下面的代碼:

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

以下get線工程。

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(); 
     }); 

     } 
    }); 
}); 

我做錯了什麼?

+0

以及在'POST'要求你不保存會話,這樣,形成後來的用戶名可以從它的後面進行檢索你的其他限制路線。看到類似的[SO問題](https://stackoverflow.com/q/26531143/3521116) – warl0ck

+0

但我已經寫了'save()'方法? –

+0

首先你能告訴我爲什麼你只能在單一函數中使用兩個'function',連接到'connectionPool'只會增加服務器的響應時間和第一個'function(req ,res,next)'爲什麼你使用'next()'這不是必需的。 – warl0ck

回答

0

既然是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(); 
     } 
    }); 
}); 
+0

會===解決會話問題嗎? –

+0

不知道它是否會徹底解決問題,但這是肯定的問題之一 – warl0ck

+0

對不起,它不工作。 –