我有一个模块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()
调用未进行,或者它立即失败并且无法返回执行null
函数中的任何行之前(err, res) => {}
。如何让查询实际运行?
编辑:我认为发生的事情是getUser
被调用时,pgclient.connect()
尚未建立数据库连接,因此pgclient.query()
无声地失败。当我将所有连接代码和getUser
移动到具有我的测试过程的同一文件中时,它成功运行。所以我需要做的是弄清楚在导出的函数可用于测试过程时如何在模块中建立连接。
答案 0 :(得分:2)
您不能像在以下行中那样将异步函数的结果分配给变量:
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"]);
}
});
您也可以使用也可以执行相同但具有更多功能的承诺。