У меня есть простой пользовательский модуль, в котором все методы должны возвращать записи базы данных.
Я получаю все записи после выполнения запроса, но когда я пытаюсь присвоить эти записи какой-либо переменной, появляется сообщение 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());
Все пустые или нулевые. Пожалуйста, направьте или подскажите. Я что-то упустил?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Добро пожаловать, мой друг, в мир асинхронных функций. В вашем коде
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 (мой личный выбор).
Кстати, это роутер? Куда идет ответ?
Пожалуйста, проверьте, обновлен ли ответ, и ответьте мне, работает он или нет.
В файле route/index.js я вызываю такой метод const myModel = require('../localmodule'); мояМодель.все()
что ты имеешь в виду ? .php файл?
postModel.all().then(data =>{ console.info(data); }); не могли бы вы попробовать это вместо этого и дать мне отзыв?
Давайте продолжить обсуждение в чате.
Попробуйте использовать 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 в экспорт модуля? или есть ли хороший способ сделать это. Пожалуйста, помогите.
Позволь мне проверить.
Я предложил async/await, так как в наши дни в javascript было бы лучше, если бы вы использовали это для синхронной работы, и кажется, что ваш код предназначен только для одного файла, и если вам действительно нужно что-то реализовать в обратном вызове в этом месте " консоль .log("admin.js:" + postModel.all()); " ---> попробуйте сделать: function getData(cb) {postModel.all((ошибка, документы) => { if (ошибка) { return cb(null, null); } else { return cb(null, docs); }})}
#Atih Shakya @Atih Shakya Приведенный выше код не работал и выдавал предупреждение Promise { <pending> } (node:2480) UnhandledPromiseRejectionWarning: TypeError: (промежуточное значение) не повторяется