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语句?
我找到了为什么会遇到上述错误的答案;
数据库连接的奇怪行为是因为 pg 的配置已过时。
我现在已将配置更改为:
const dbConfig = {
connectionString: conString,
ssl: { rejectUnauthorized: false }
}
var dbClient = new pg.Client(dbConfig);
dbClient.connect();
我也不再关闭连接,只是保持连接。
虽然我仍然不确定为什么我的旧函数不起作用,但我已经重写了我的函数,现在一切都按预期工作了;
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);
});
我是 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语句?
我找到了为什么会遇到上述错误的答案;
数据库连接的奇怪行为是因为 pg 的配置已过时。 我现在已将配置更改为:
const dbConfig = { connectionString: conString, ssl: { rejectUnauthorized: false } } var dbClient = new pg.Client(dbConfig); dbClient.connect();
我也不再关闭连接,只是保持连接。
虽然我仍然不确定为什么我的旧函数不起作用,但我已经重写了我的函数,现在一切都按预期工作了;
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); });