2017-06-15 84 views
1

我知道下面的代码打印我在命令行上查询的结果:获取Postgres的查询中的NodeJS变量的结果

query.on("row", function (row, result) { 
    result.addRow(row); 
}); 

query.on("end", function (result, callback) { 
    println(JSON.stringify(result)) 
}); 

不过,我想在使用结果值以下代码作为变量,而不仅仅是打印到命令行。

更新:能够使用该值的下一个查询是不够的,我希望它是查询范围之外:提前为你的答案

query.on("row", function (row, result) { 
    result.addRow(row); 
}); 

query.on("end", function (result, callback) { 
    println(JSON.stringify(result)) 
}); 
//use the result here 

感谢。

回答

2

你有2种选择:

  • 如果你想继续使用基本的驱动程序,你将不得不使用结果的回调,然后窝那些为了在未来的查询使用结果:

    connection.query(query1, values1, function(err1, result1) { 
        // check if(err1) first, then: 
        connection.query(query2, values2, function(err2, result2) { 
         // check if(err2) first, then: 
         connection.query(query3, values3, function(err3, result3) { 
          // check if(err3) first, then: 
          cb(result1, result2, result3);   
         }); 
        }); 
    }); 
    
  • 的另一种方法是使用承诺(pg-promise)时,你可以调用链是这样的:

    db.query(query1, values2) 
        .then(data => { 
         return db.query(query2, values2); 
        }) 
        .then(data => { 
         return db.query(query3, values3); 
        }) 
        .catch(error => {}); 
    

虽然pg-promise在这种情况下,正确的做法是通过方法task

db.task(t => { 
    const result = {}; 
    return t.query(query1, values1) 
     .then(data => { 
      result.a = data; 
      return t.query(query2, values2); 
     }) 
     .then(data => { 
      result.b = data; 
      return t.query(query3, values3); 
     }); 
     .then(data => { 
      result.c = data; 
      return result; 
     }); 
}) 
    .than(data => { 
     // data = {a, b, c} 
    }) 
    .catch(error => {}); 

第二种方法会自动给您一次访问ES6和执行多个查询时,ES7的现代语法,你可以这样做:

对于ES6:

db.task(function * (t) { 
    let a = yield t.query(query1, values1); 
    let b = yield t.query(query2, values2); 
    let c = yield t.query(query3, values3); 
    return {a, b, c}; 
}) 
    .than(data => { 
     // data = {a, b, c} 
    }) 
    .catch(error => {}); 

对于ES7 /巴贝尔:

db.task(async t => { 
    let a = await t.query(query1, values1); 
    let b = await t.query(query2, values2); 
    let c = await t.query(query3, values3); 
    return {a, b, c}; 
}) 
    .than(data => { 
     // data = {a, b, c} 
    }) 
    .catch(error => {}); 
+0

这对我的问题来说是一个很好的答案,但问题是不安全,对不起。如果您阅读更新后的问题并再次帮助我,我会很感激的)。 – Sebastian

+0

@Sebastian在那里,我已经更新了答案。 –