【问题标题】:Returning the result of a node-postgres query返回 node-postgres 查询的结果
【发布时间】:2020-02-03 20:57:45
【问题描述】:

我正在尝试返回 node-postgres 查询的结果并将其存储在变量中。我可以很好地管理 console.log,但找不到返回结果的方法,以便在查询方法之外可以访问它。我不知所措,并且知道我必须遗漏一些明显的东西(或多个明显的东西),因为如果不可能做到这一点,我就不明白 node-postgres 的意义,因为我将永远能够要做的是将我的结果记录到控制台。

我已经尝试了下面的代码以及使用 Promise 的版本,并且都收到了相同的结果,“未定义”。 else 中的 console.log 工作正常,但返回不会使函数的其余部分可以访问结果。在下面的代码中,我的返回返回为“未定义”,console.log 代替它。

var selectFrom = function(data, table, condition) {
    var queryResult;
    pool.query(`SELECT ${data} FROM ${table} ${condition}`, function(err, result) {
        if(err) { console.log(err); }
        else { queryResult = result.rows[0][data]; }
    })
    pool.end();
    return queryResult;
}

var result = selectFrom('amount','total_nonfarm_monthly_sa', `WHERE month='2019-08-31'`);
console.log(result);

【问题讨论】:

  • 您的return queryResult 在查询完成之前返回。在返回结果之前,您必须以某种方式等待结果来自 DB。阅读有关 async/await 的信息,或者可能返回一个通过数据库结果解决的 Promise。

标签: node.js node-postgres


【解决方案1】:

这就是你要找的东西:

async function selectFrom(data, table, condition) {
  try {
    const res = await pool.query(
      `SELECT ${data} FROM ${table} ${condition}`
    );
    return res.rows[0][data];
  } catch (err) {
    return err.stack;
  }
}

在上一个函数之外:

async function whateverFuncName () {
   var result = await selectFrom('amount','total_nonfarm_monthly_sa', `WHERE month='2019-08-31'`);
   console.log(result);
}

编辑:我没有运行此代码 sn-p,但主要概念非常简单。

【讨论】:

    【解决方案2】:

    “查询”方法是异步调用,您应该使用 async/await 或 Promise。

    使用异步/等待:

    await client.connect()
    const res = await client.query("SELECT amount FROM total_nonfarm_monthly_sa WHERE month='2019-08-31'");
    console.log(res.rows[0]);
    await client.end();
    

    编辑: 我可以看到有一个回调选项,但我会使用 async/await

    【讨论】:

    • 对不起,这只是代码的一部分吗?单独输入时,我收到一条错误消息,等待仅在异步函数中有效。
    • 当你把它放在你的函数中时,请确保在它的声明中具有异步,如下所示: async function myFunc(){ await ... }
    【解决方案3】:

    你需要使用回调:

    var selectFrom = function(data, table, condition, callback) {
    
        pool.query(`SELECT ${data} FROM ${table} ${condition}`, function(err, result) {
            if(err)
                return callback(err);
            callback(null, result.rows[0][data]);
        })
        pool.end();
    }
    
    selectFrom('amount','total_nonfarm_monthly_sa', `WHERE month='2019-08-31'`, function(err, result){
        console.log(err, result);   
    });
    

    或承诺:

    var selectFrom = function(data, table, condition) {
        return new Promise(function(resolve, reject){
            pool.query(`SELECT ${data} FROM ${table} ${condition}`, function(err, result) {
                if(err)
                    return reject(err);
                resolve(result.rows[0][data]);
            })
            pool.end();
        });
    }
    
    selectFrom('amount','total_nonfarm_monthly_sa', `WHERE month='2019-08-31'`)
    .then(function(result){
        console.log(result);    
    }).catch(function(err){
        console.log(err);   
    });
    

    【讨论】:

    • 谢谢,这两种方法都允许我通过 selectFrom 函数记录值。不幸的是,我仍然不知道如何将值存储在变量中。我尝试设置一个等于 selectFrom 的变量,返回“结果”而不是记录它,以及返回一个将结果设置为属性值的对象。在这两种情况下,输出都是“未定义”。
    猜你喜欢
    • 1970-01-01
    • 2020-06-20
    • 2013-06-30
    • 2019-12-17
    • 2020-04-15
    • 1970-01-01
    • 2015-07-15
    • 2011-04-17
    • 2020-07-09
    相关资源
    最近更新 更多