Сеанс не определен вне асинхронного метода в узле JS - PullRequest
0 голосов
/ 24 июня 2019

Ребята, я новичок в nodejs. Мое требование состоит в том, чтобы сохранить несколько пользовательских данных из разных таблиц для дальнейшего процесса в моем проекте api rest, после прочтения которого я получил, что должен сохранить результат запросов в сеансе для дальнейшего использования. Вот мой код, я не могу получить значения сеанса вне асинхронного вызова результата запроса. Каков наилучший способ сохранить данные о пользователях из разных таблиц и использовать их для дальнейших запросов.

Метод:

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

                }  


              }
            }); 

    });  

};

Ответы [ 2 ]

2 голосов
/ 24 июня 2019

Сначала вам нужно ВЕРНУТЬ обещание из функции getRightOnCity.

return myPromise.then и, возможно, потребуется обернуть вызов БД в обещание.

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

};

Теперь, чтобы использовать его, вам нужна .then или await функция.

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

Примечание: смешивать Promise и callback

не очень хорошая идея
0 голосов
/ 24 июня 2019

Когда вы передаете req.session в getRightOnCity как req_session, вы просто передаете копию содержимого req.session. Вы должны манипулировать req.session непосредственно из первого метода или через функцию промежуточного программного обеспечения ExpressJS.

...