Узел экспресс: не удается получить доступ к данным после выполнения запроса - PullRequest
3 голосов
/ 06 мая 2019

У меня есть простой пользовательский модуль, в котором все методы должны возвращать записи базы данных.

Я получаю все записи после выполнения запроса, но когда я пытаюсь назначить эти записи какой-то переменной, он говорит null.Не уверен что происходит.Вот мой код пользовательского модуля:

module.exports = {

    mydata: {},
    all: function (req, res, next) {

        var posts = null;

        con.query("SELECT post_id,title, body from `posts`", function (err, rows, fileds) {
            if (err) {
                console.log('Error' + err);
            }
            posts = rows[0]; // assigned object object to posts but not working


            console.log('names' + posts);
        });

        console.log('my posts' + posts); // it says null/empty 
        return posts;       // empty return

    },

Я вызываю все методы, подобные этому на моем маршруте:

console.log("admin.js :" + postModel.all());

Все они пусты или имеют значение null.Пожалуйста, руководство или предложить.Я что-то упустил?

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Добро пожаловать, мой друг, в мир асинхронных функций.В вашем коде console.log('my posts' + posts); и return posts; выполняются до того, как обратный вызов назначит значения переменной posts .

Также ограничьте себя в использовании var и использовании let для объявления переменной лучше работает без ошибок для функций с областью действия.

Здесь ниже ключевое слово async объявляет, что функция асинхронная
await *Ключевое слово 1017 * в основном говорит, что позволяет сначала получить результат, а затем перейти к следующему утверждению / строке. Все awaits должны выполняться только внутри async функций.

module.exports = {

mydata: {},
  all: async function (req, res, next) { //Let this be an asynchronous function
      try{
         let [rows, fields] = await con.query("SELECT post_id,title, body from `posts`");
         //let us await for the query result so stay here until there is result

         let posts = rows[0]; // assign first value of row to posts variable now
         console.log('my posts' + posts);
         return posts;
      }catch(err){
         return err;
      }
  },
}

Пожалуйста, уделите времячитать природу Асинхронного, Неблокирующего в Javascript и как обрабатывать их с помощью Promises или Async / await (мой личный выбор).

0 голосов
/ 06 мая 2019

Попробуйте использовать async & await, плюс рекомендуется обернуть код в try catch, любое ожидающее обещание будет разрешено с помощью метода .then или любая ошибка будет обнаружена в .catch функции caller / final:

/ * Обработчик (или) Сервис (или) Что угодно * /

const FetchDataFromDB = require('../');

/* caller Function */
let fetchDataFromDB = new FetchDataFromDB();
fetchDataFromDB.getDataFromDB()
    .then((res) => console.log(res))
    .catch((err) => console.log(err))

/ * Уровень БД * /

class FetchDataFromDB {

    /* Method to get data from DB */
    async getDataFromDB() {

        const getQuery = "SELECT post_id,title, body from `posts`";
        try {
            let dbResp = await con.query(getQuery);
            if (dbResp.length) {
                //Do some logic on dbResp
            }
            return dbResp;
        } catch (error) {
            throw (error);
        }
    }
}

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