Я новичок в узле и обещаниях. У меня есть два файла - server.js
и db.js
server.js
импортирует db.js
качестве модулей.
Я извлекаю некоторые данные из базы данных SQL в модуле db.js
и я пытаюсь передать эти данные функции в server.js
. Я успешно извлек данные из базы данных, но когда я пытаюсь передать ее функции в server.js
, она возвращает только undefined
значение.
Здесь код
server.js
const db = require('./db.js');
app.post('/api/trigger-push-msg/', function (req, res) {
return getSubscriptionsFromDatabase()
.then(function(subscriptions) {
// Do something
});
});
function getSubscriptionsFromDatabase() {
return new Promise((resolve, reject) => {
let subscriptions = db.getSubscriptions();
console.log(subscriptions); // this only prints "undefined"
if (subscriptions != undefined) {
resolve(subscriptions);
} else {
reject("No"); // this executes
}
})
}
db.js
module.exports = {
getSubscriptions: function() {
var sql = "SELECT * FROM subscriptions";
con.query(sql, function(err, result) {
if (err) throw err;
console.log(result); // this prints the same result as I want
return result;
})
}
}
getSubscriptions
нет оператора return
и учитывая, что в нем есть какое-то асинхронное содержимое, вы должны обернуть все внутри обещания и вызвать следующую логику только после ее разрешения.
module.exports = {
getSubscriptions: function() {
var sql = "SELECT * FROM subscriptions";
return new Promise(function(resolve, reject){
con.query(sql, function(err, result) {
if (err) return reject(err);
resolve(result);
})
})
}
}
затем:
function getSubscriptionsFromDatabase() {
return db.getSubscriptions()
.then(function(subscriptions){
return subscriptions;
})
}
и на вашем маршруте:
app.post('/api/trigger-push-msg/', function (req, res) {
getSubscriptionsFromDatabase()
.then(function(subscriptions) {
res.send(subscriptions);
})
.catch(function(err){
res.sendStatus(500);
})
});
resolve(subscriptions);
но это не выполняется вообще.
return new Promise(…)
в функциюgetSubscriptions
. Вы не можетеreturn
из этого обратного вызова, вы можете только позвонитьresolve
.