Передача объекта из функции запроса SQL в отдельную функцию [duplicate]

1

Я новичок в узле и обещаниях. У меня есть два файла - 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;
    })
  }
}
  • 0
    Вы должны поместить return new Promise(…) в функцию getSubscriptions . Вы не можете return из этого обратного вызова, вы можете только позвонить resolve .
Теги:
function
promise
nested-function

1 ответ

1
Лучший ответ

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);
  })
});
  • 0
    Я добавил консольный журнал перед resolve(subscriptions); но это не выполняется вообще.
  • 0
    Я исправил код, проверьте, работает ли он сейчас :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню