我有一个模块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移到具有测试过程的同一文件中时,它成功运行。因此,我需要做的是找出如何在导出的函数对测试过程可用时在模块中建立连接。

最佳答案

不能像在下面一行中那样将异步函数的结果赋给变量:

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"]);
    }
});

你也可以使用承诺,它做同样的事情,但有更多的功能。

10-06 06:19