gpt4 book ai didi

node.js - node-postgres 没有执行 client.query()?

转载 作者:行者123 更新时间:2023-11-29 14:33:19 25 4
gpt4 key购买 nike

我有一个模块 database.js 用于在 Node.JS 中运行 PostgreSQL 查询,如下所示:

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

const pgclient=new Client({
connectionString:process.env.DATABASE_URL,
ssl:true
});

pgclient.connect();

module.exports={

getUser:function(phonenumber){
queryStr='SELECT * FROM users where phonenumber=\''+phonenumber+'\';';
console.log(queryStr);
pgclient.query(queryStr, (err, res) => {
console.log("rows length "+res.rows.length);
if (err) throw err;
if (res.rows.length==0){
return null;
}
else{
return res.rows[0];
}
});
}
}

当我调用它时,使用例如

var db=require('./database');
userObj=db.getUser('+19991112222');
if (userObj==null){
console.log("user not found");
}
else{
console.log(userObj["phonenumber"]);
}

然后我得到以下控制台日志记录:

SELECT * FROM users where phonenumber='+19991112222';
user not found

因为 rows length 行没有出现在控制台日志中,我认为 pgclient.query() 调用要么没有进行,要么在执行 (err, res) => {} 函数中的任何行之前立即静默失败并返回 null。如何让查询实际运行?

编辑:我认为发生的事情是当 getUser 被调用时,pgclient.connect() 还没有建立数据库连接,所以 pgclient .query() 静默失败。当我将所有连接代码和 getUser 移动到包含我的测试程序的同一文件中时,它成功运行了。所以我需要做的是弄清楚如何在导出函数对测试过程可用时在模块中建立连接。

最佳答案

您不能将异步函数的结果分配给变量,就像您在以下行中所做的那样:

userObj=db.getUser('+19991112222');

你必须在回调中分配它。

所以,可以这样来做:

module.exports={

// I am passing a callback function which takes error as first argument and data as second
getUser:function(phonenumber, callback){
queryStr='SELECT * FROM users where phonenumber=\''+phonenumber+'\';';
console.log(queryStr);
pgclient.query(queryStr, (err, res) => {
console.log("rows length "+res.rows.length);
if (err) return callback(err);
if (res.rows.length==0){
return callback(null, null);
}
else{
return callback(null, res.rows[0]);
}
});
}
}

然后你可以像这样使用它:

var db=require('./database');
// Here I'm passing the function which is the callback and I handle the error and user in this function.
db.getUser('+19991112222', function(err, user) {
if (err) throw err;
if (user==null){
console.log("user not found");
}
else {
console.log(userObj["phonenumber"]);
}
});

您也可以使用 promises,它做同样的事情,但功能更多。

关于node.js - node-postgres 没有执行 client.query()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48419870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com