#node.js #express #promise #async-await
#node.js #экспресс #обещание #async-ожидание
Вопрос:
Я пытаюсь избежать ада обратного вызова в своем экспресс-приложении, сделав все мои вызовы базы данных синхронными. Однако даже при использовании async / await и promises приведенная ниже функция возвращает ‘undefined’, потому что консоль.запись в журнал выполняется до завершения выполнения предыдущего оператора.
app.post("/users", async (req, res) => {
...
const users = await GetUsersFromDatabase();
console.log(users);
...
});
Следующая асинхронная функция указана следующим образом:
const DBUtil = require("./db-service");
...
async function GetUsersFromDatabase() {
var p = new Promise(function(resolve, reject) {
DBUtil.query(
"SELECT * FROM Users",
(err, data) => {
if (err) {
reject(error);
}
resolve(data.recordset);
});
});
}
Где db-service выглядит как:
const sql = require('mssql');
let connPoolPromise = null;
var dbConfig = require('./config/database_config.json');
const getConnPoolPromise = () => {
if (connPoolPromise) return connPoolPromise;
connPoolPromise = new Promise((resolve, reject) => {
const conn = new sql.ConnectionPool(dbConfig);
conn.on('close', () => {
connPoolPromise = null;
});
conn.connect().then(connPool => {
return resolve(connPool);
}).catch(err => {
connPoolPromise = null;
return reject(err);
});
});
return connPoolPromise;
}
// Fetch data example using callback
exports.query = (sqlQuery, callback) => {
getConnPoolPromise().then(connPool => {
}).then(result => {
callback(null, result);
}).catch(err => {
callback(err);
});
};
Консоль.журнал выше печатает
не определено
И я убедился, что данные sql возвращены правильно. Однако почему мой асинхронный метод не работает?
Комментарии:
1. Вы не возвращаете обещание в
GetUsersFromDatabase
2. @Phix Спасибо
3. Никаких проблем! Это происходит.