会话在节点js中的异步方法之外未定义

session is undefined outside the async method in node js

伙计们,我是 nodejs 的新手。我的要求是从不同的表中保存一些用户详细信息,以便在我的其余 api 项目中进行进一步处理,阅读后我知道我应该保存会话中的查询结果以供进一步使用。这是我的代码,我无法在查询结果异步调用之外获取会话值。 从不同的表中保存用户详细信息并将其用于进一步查询的最佳方法是什么。

方法:

 if(sess.email)
      {
        console.log("session is valid");
          checkProfile.getRightOnCity(req.decoded , req.session);
          console.log("city session ::" ,  sess.cities); //i am getting this undeifned
      }

getRightOnCity:

var getRightOnCity = function getRightOnCity(req_decoded,req_session) {
    var myPromise = dbname(req_decoded);
    var user_id = getUserid(req_decoded);
    var details = getUserDetails(req_decoded);

    console.log("user details :: " , details);
    var cities = [];
    myPromise.then(function(myDBName) { 

        new_conn(myDBName).query("Select city_id from " + myDBName + ".rights_on_city where user_id="+user_id, function (err, res) {
        if(err) {
                    console.log("error: ", err);
                    result(null, err);
                }
                else{

                for(var i=0 ; i < res.length ; i++) {
                  cities.push(res[i].city_id);
                  req_session.cities = cities.join();

                  console.log("city::" , req_session.cities);
                  console.log("email inside get cities " ,  req_session.email);
                  req_session.save();

                }  


              }
            }); 

    });  

};

首先,您需要 RETURN 来自 getRightOnCity 函数的承诺。

return myPromise.then 并且可能还需要将数据库调用包装在 promise 中。

function getRightOnCity(req_decoded, req_session) {
    var myPromise = dbname(req_decoded);
    var user_id = getUserid(req_decoded);
    var details = getUserDetails(req_decoded);

    console.log("user details :: ", details);
    var cities = [];
    return myPromise
        .then(function (myDBName) {
            return new Promise((resolve, rej)=>{ //<==here
                new_conn(myDBName).query("Select city_id from " + myDBName + ".rights_on_city where user_id=" + user_id, function (err, res) {
                    if (err) {
                        console.log("error: ", err);
                        result(null, err);
                        rej(err);
                    } else {
                        for (var i = 0; i < res.length; i++) {
                            cities.push(res[i].city_id);
                            req_session.cities = cities.join();

                            console.log("city::", req_session.cities);
                            console.log("email inside get cities ", req_session.email);
                            req_session.save();
                        }
                        resolve();
                    }
                });
            })
        });

};

现在,要使用它,您需要 .thenawait 函数。

if (sess.email) {
    console.log("session is valid");
    checkProfile
    .getRightOnCity(req.decoded, req.session)
    .then(()=>{
        console.log("city session ::", sess.cities);
    })
}

注意:混合使用 Promisecallback

不是个好主意

当您将 req.session 作为 req_session 传递给 getRightOnCity 时,您只是在传递 req.session 内容的副本。您应该直接从第一种方法或通过 ExpressJS 中间件函数操作 req.session