Nodejs 和 postgres:从密码验证查询返回数据

Nodejs and postgres: returning data from query for password validation

我是 javascript/nodejs 的新手,我正在尝试构建一个简单的登录,其中我有一个应该 return 查询结果的函数。

我是如何配置连接的;

pg.defaults.ssl = true;
let dbClient = new pg.Client(conString);
dbClient.connect();

回调函数;

    app.post("/login", urlencodedParser, function(req, res) {

  let uName = req.body.username;
  let pwdInput = req.body.password;
  let fetchedPwd;

  function fetchPwd (usr, callback) {

     dbClient.query("SELECT pwd FROM users where username = ", [usr], function (err, res) {

       if (err) {
         callback(err, null);
        }

        else {
          callback (null, res[0].pwd);
        }
     });}

函数调用;

fetchPwd(uName, function(err, res) {
if (err) {
  console.log(err);
}
else {
  fetchedPwd = res;
}})

支票;

  if (pwdInput == fetchedPwd) {
    req.session.user = uName;
    res.redirect("/");
  }

  else {

    res.render("login", {login_error: "Wrong user and password combination!"});
  }

});

如我所料; return 一个字符串的回调函数,然后我可以检查输入。

遇到错误; 错误:客户端已关闭且不可查询

出于测试目的,我在文件末尾注释掉了 dbClient.end(); 之后 callback (null, res[0].pwd); 行抛出以下错误; 类型错误:无法读取未定义的属性(读取 'pwd')

(pwd 是数据库中正确的列名)

我不明白为什么会出现这些错误。 根据我的预期,该功能应该在达到 dbClient.end(); 之前完成。

同样针对第二个错误; 为什么res[0].pwd是未定义的,当查询结果显然不为空时,因为到达了else语句?

我找到了为什么会遇到上述错误的答案;

  1. 数据库连接的奇怪行为是因为 pg 的配置已过时。 我现在已将配置更改为:

    const dbConfig = {
           connectionString: conString,
           ssl: { rejectUnauthorized: false }
         }
         var dbClient = new pg.Client(dbConfig);
         dbClient.connect();
    

我也不再关闭连接,只是保持连接。

  1. 虽然我仍然不确定为什么我的旧函数不起作用,但我已经重写了我的函数,现在一切都按预期工作了;

    app.post("/login", urlencodedParser, function(req, res) {
    
    let uName = req.body.username;
    let pwdInput = req.body.password;
    
    let User = {
     username: uName,
     password: ""
    }
    
    function fetchPwd (usr) {
     dbClient.query("SELECT pwd from users where username = ", [usr], function (dbError, dbResponse) {
    
       User.password = dbResponse.rows[0].pwd;
    
       if (pwdInput == User.password) {
         req.session.user = uName;
         res.redirect("/");
       }
    
       else {
         res.status(400).render("login", {login_error: "Wrong user and password combination!"});
         console.log("wrong login");
       }
     });
    }
    
    fetchPwd(User.username);
    
    });