【问题标题】:node-postgres not executing client.query()?node-postgres 没有执行 client.query()?
【发布时间】:2023-03-27 15:10:01
【问题描述】:

我有一个模块 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() 调用要么未进行,要么立即静默失败并在@987654328 中的任何行之前返回null @函数被执行。如何让查询实际运行?

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

【问题讨论】:

    标签: node.js postgresql node-postgres


    【解决方案1】:

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

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

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

    【讨论】:

    • 你测试过这个吗?我刚刚对其进行了测试,唯一的控制台输出是来自console.log(queryStr);SELECT 语句。因为我仍然没有得到rows length 的输出,所以我想知道pgclient.query() 是否没有被调用?
    • 请看我的编辑;我相信这个问题与getUser()pgclient.connect() 建立数据库连接之前被调用有关。
    • 你必须修改代码。我给你指路了。您必须分配并返回您需要的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    相关资源
    最近更新 更多