Node Express: невозможно получить доступ к данным после выполнения запроса

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

Я получаю все записи после выполнения запроса, но когда я пытаюсь присвоить эти записи какой-либо переменной, появляется сообщение 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.info('Error' + err);
            }
            posts = rows[0]; // assigned object object to posts but not working


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

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

    },

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

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
191
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Добро пожаловать, мой друг, в мир асинхронных функций. В вашем коде

console.info('my posts' + posts); и return posts;

выполняются до того, как обратный вызов присваивает значения переменной posts.

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

Ниже:

  • Ключевое слово async объявляет, что функция является асинхронной.
  • Ключевое слово await в основном говорит, что позволяет сначала получить результат, а затем перейти к следующему оператору/строке. Все 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.info('my posts' + posts);
         return posts;
      }catch(err){
         return err;
      }
  },
}

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

#Atih Shakya @Atih Shakya Приведенный выше код не работал и выдавал предупреждение Promise { <pending> } (node:2480) UnhandledPromiseRejectionWarning: TypeError: (промежуточное значение) не повторяется

Peter 06.05.2019 20:31

Кстати, это роутер? Куда идет ответ?

Atish Shakya 06.05.2019 20:55

Пожалуйста, проверьте, обновлен ли ответ, и ответьте мне, работает он или нет.

Atish Shakya 06.05.2019 20:58

В файле route/index.js я вызываю такой метод const myModel = require('../localmodule'); мояМодель.все()

Peter 06.05.2019 20:59

что ты имеешь в виду ? .php файл?

Atish Shakya 06.05.2019 21:00

postModel.all().then(data =>{ console.info(data); }); не могли бы вы попробовать это вместо этого и дать мне отзыв?

Atish Shakya 06.05.2019 21:09

Давайте продолжить обсуждение в чате.

Peter 06.05.2019 21:10
Ответ принят как подходящий

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

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

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

/* caller Function */
let fetchDataFromDB = new FetchDataFromDB();
fetchDataFromDB.getDataFromDB()
    .then((res) => console.info(res))
    .catch((err) => console.info(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;

@sarinivas спасибо за ваш ответ. Я использую module.exports, в котором у меня есть список функций/свойств, как вы можете. Как я могу добавить обратный вызов getDataFromDB в экспорт модуля? или есть ли хороший способ сделать это. Пожалуйста, помогите.

Peter 06.05.2019 21:30

Позволь мне проверить.

Peter 06.05.2019 21:44

Я предложил async/await, так как в наши дни в javascript было бы лучше, если бы вы использовали это для синхронной работы, и кажется, что ваш код предназначен только для одного файла, и если вам действительно нужно что-то реализовать в обратном вызове в этом месте " консоль .log("admin.js:" + postModel.all()); " ---> попробуйте сделать: function getData(cb) {postModel.all((ошибка, документы) => { if (ошибка) { return cb(null, null); } else { return cb(null, docs); }})}

whoami - fakeFaceTrueSoul 06.05.2019 22:16

Другие вопросы по теме