2017-06-15 48 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在那裏,我已經更新了答案。 –