【问题标题】:Pass object from SQL query function to a separate function [duplicate]将对象从 SQL 查询函数传递到单独的函数 [重复]
【发布时间】:2017-12-03 11:19:23
【问题描述】:

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

server.jsdb.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;
    })
  }
}

【问题讨论】:

  • 您应该将return new Promise(…) 放入getSubscriptions 函数中。你不能从那个回调中return,你只能调用resolve

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


【解决方案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);
  })
});

【讨论】:

  • 我在resolve(subscriptions); 之前添加了一个控制台日志语句,但它根本没有执行。
  • 我已经修复了代码,检查它现在是否可以工作:)
猜你喜欢
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多