我两次之前遇到过这个问题。第一次,这是因为返回的对象实际上是一个未实现的承诺,我能够通过将所有代码扔到块中来绕过它,以便它在那里执行。不完全是一个理想的解决方案,但它工作,我很匆忙。
我第二次使用pg-promise
而不仅仅是pg
,当这个问题突然出现时,我想“它一定是那个该死的承诺”,所以不要把我的头发撕掉我只是已卸载pg-promise
,而是使用postgres
的常规nodejs
包。好吧,问题仍然存在,我正在撕裂我的头发。
我正在制作API。我有一个控制器,其功能包括getPayment
和postPayment
等等。在这些函数的某些时刻,我需要从数据库中获取信息。在另一个我称为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.query
。 select()
应该做到这一点,然后返回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
代表“成功”。实际上,任何人都希望能够实际访问数据。