将对象从SQL查询函数传递给单独的函数

时间:2017-06-29 16:25:09

标签: javascript node.js function promise nested-function

我是节点和承诺的新手。我有两个文件 - server.jsdb.js

server.js导入db.js作为模块。

我从db.js模块中的SQL数据库中获取一些数据,并且我试图将该数据传递给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;
    })
  }
}

1 个答案:

答案 0 :(得分:1)

getSubscriptions没有返回语句

并且考虑到其中存在一些异步内容,您应该将所有内容包装在一个promise中,并且只有在它结算后才触发后续逻辑。

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);
  })
});