postgres with nodejs - 如何返回查询结果

时间:2018-03-31 21:47:27

标签: javascript node.js postgresql asynchronous

我两次之前遇到过这个问题。第一次,这是因为返回的对象实际上是一个未实现的承诺,我能够通过将所有代码扔到块中来绕过它,以便它在那里执行。不完全是一个理想的解决方案,但它工作,我很匆忙。

我第二次使用pg-promise而不仅仅是pg,当这个问题突然出现时,我想“它一定是那个该死的承诺”,所以不要把我的头发撕掉我只是已卸载pg-promise,而是使用postgres的常规nodejs包。好吧,问题仍然存在,我正在撕裂我的头发。

我正在制作API。我有一个控制器,其功能包括getPaymentpostPayment等等。在这些函数的某些时刻,我需要从数据库中获取信息。在另一个我称为postgres.js的文件中,我有一个与数据库的连接,然后是我可以调用的函数,用于插入数据,选择等。 这是postgres.js,因为它现在(这适用于打印到控制台):

module.exports = {
    select: select

};

const { Client } = require('pg');


const client = new Client({
  user: 'myUser',
  host: 'localhost',
  database: 'myDB',
  password: 'myPassword',
  port: 5432,
});

client.connect();

function select(){
    client.query('SELECT * FROM payments', (err, res) => {
      console.log(err ? err.stack : res.rows[0].id);
      client.end();
    });
}

正如您现在所看到的,它只是从表中获取付款并将值(在这种情况下,第一行的id)打印到控制台。 以下是从控制器(payments.js)调用此函数的代码:

var pg = require('../../config/postgres.js')

...

function getPaymentInfo(params){

 // get info from the DB

// disregard the fact that I'm not sending  any params right now, this is for testing
 var result = pg.select();
 console.log(result);
 console.log(typeof result);
}

调用pg.select()实际上会激活postgres.js上的select函数(并且控制台日志正确地打印res.rows[0].id中的数据)但是当我尝试在return res.rows[0].id放置var result时为了实际返回从数据库中检索到的信息,根据控制台,返回到function select(){ var i = ''; client.query('SELECT * FROM payments', (err, res) => { //console.log(err ? err.stack : res.rows[0].id); i = err? err.stack : res.rows[0].id; client.end(); }); return i; } 的内容是“未定义的”。以下是我试图获取数据的一些例子:

function select(){
        client.query('SELECT * FROM payments', (err, res) => {
          //console.log(err ? err.stack : res.rows[0].id);
          return res.rows[0].id;
          //client.end();
        });
    }

我尝试使用和不注释console.log行,无论哪种方式都不起作用。

undefined

我认为这是错误的,因为我在没有检查错误的情况下返回,但我只是想看看会发生什么...... function select(){ client.query('SELECT * FROM payments', (err, res) => { //console.log(err ? err.stack : res.rows[0].id); return err ? err.stack : res.rows[0].id; //client.end(); }); }

err

这次检查undefined,仍然会返回function select(){ return client.query('SELECT * FROM payments', (err, res) => { //console.log(err ? err.stack : res.rows[0].id); // Hello World! client.end(); return err ? err.stack : res.rows[0].id; }); }

client.query(etc etc);

function select(){ var i = 'original i'; client.query('SELECT * FROM payments', (err, res) => { console.log(err ? err.stack : res.rows[0].id); // Hello World! if (err){ i = "i has changed!"; } else { i = "i has not changed!"; } client.end(); }); return i; } 返回返回..和以前一样。也试过没有明确的返回,没有检查错误,都是一样的。

这是我尝试过的最后一次测试:

original i
string
2

控制台显示:

res.rows[0].id

最后一个“2”为getPaymentInfo()

我真的相信这一定与爆破的“承诺”和异步的东西有关。但我以前的“解决方案”不适合这里。我不能只在我可以访问res的那个区域内做所有事情。我 能够将某些数据返回client.query(...)

似乎getPaymentInfo()正在等待console.log(result)中的每一行在实际执行任何操作之前运行。我可以看到,因为在控制台中,console.log(typeof result)console.log(err ? err.stack : res.rows[0].id)的结果显示在显示表格信息的行之前(来自pg.select())。这绝对令人气愤。

我调用了client.query()函数。该函数调用client.queryselect()应该做到这一点,然后返回getPaymentInfo(),然后返回await然后然后继续前进并执行下一行所说的内容。这是任何程序的正常行为。显然,这不会发生在这里。

我看到一些使用await的示例,但是当我尝试添加复制示例时,它给了我一个语法错误,好像它不能识别yield应该是什么是。还有一个then的例子,同样的错误。它不知道那些命令是什么意思。我正在使用最新版本的nodejs(v8.10.0)。

我也尝试使用function generatePaymentInfo(params){ ... pg.select().then(function(v) { console.log(v); }); ... } 让它等待:

TypeError: Cannot read property 'then' of undefined

它给了我这个错误:

pg

这里发生了什么?如何让它以正确的顺序做事?我想要的只是从表中获取一些信息。 pg-promise包的每个示例(以及console.log())我看到那里只有In [1]: import pkg_resources.py31compat --------------------------------------------------------------------------- ImportError Traceback (most recent call last) <ipython-input-1-136e80f945a9> in <module>() ----> 1 import pkg_resources.py31compat ImportError: No module named py31compat 代表“成功”。实际上,任何人都希望能够实际访问数据。

0 个答案:

没有答案