gpt4 book ai didi

node.js - 处理 Postgres 错误消息以执行正确的查询

转载 作者:行者123 更新时间:2023-11-29 14:10:14 24 4
gpt4 key购买 nike

我正在使用 pgnode.js。当用户使用 auth0 小部件登录时,我传递它返回的电子邮件并检查我的数据库以查看该用户是否存在。如果用户不存在,我将把它们插入到数据库中。我已经设法通过一个函数的 hack 工作来完成这项工作,但我希望能得到一些帮助来解决这个问题。

我面临的问题。

  1. 在检查数据库中的电子邮件时,它不会检查整个电子邮件地址。

    var emailCheck = "SELECT id from public.user WHERE email="+ req.body.email;

    req.body.email;其实就是myemail@example.com

返回这个错误,

column "myemail" does not exist

虽然

myemail@example.com

确实存在。

  1. 不管它抛出的错误如何,它都会继续插入电子邮件地址。如果不存在,则将其插入。由于电子邮件上有唯一键,因此会引发错误

    重复键值违反唯一约束“uk_user_email”

所以要解决这个问题,我的问题是为什么它不在 @ 符号之后检查?我应该遵循什么逻辑来更改此函数以运行第一个查询,并且仅在第一个查询未找到相关电子邮件地址时才运行第二个查询?

checkRegister: function(req, res) {
pool.connect(function(err, client, done) {
if (err) {
return console.error('error fetching client from pool', err);
} connection
var emailCheck = "SELECT id from public.user WHERE email=" + req.body.email;
var emailInsert = "insert into public.user (user_auth_level,email,account_locked,contract) " +
"values ('1','" + req.body.email + "','false','false')"
client.query(emailCheck, function(err, result) {
if (err) {
return console.error(err.message);
}

});
client.query(emailInsert, function(err, result) {
if (err) {
return console.error(err.message);
}

});
done();
});
pool.on('error', function(err, client) {
console.error('idle client error', err.message, err.stack)
});
}

最佳答案

您需要用 ' 包裹您的值以使其成为字符串。如果没有字符串换行,它将在列之间进行比较。应该是:

var yourQuery = "SELECT id from public.user WHERE email=" + req.body.email; // SELECT id from public.user WHERE email=myemail@example.com
var correntQuery = "SELECT id from public.user WHERE email='" + req.body.email + "'"; // SELECT id from public.user WHERE email='myemail@example.com'

Nodejs 是同步的,您需要使用回调或 promise 来链接您的代码,如下所示:

checkRegister: function (req, res) {
pool.connect(function (err, client, done) {
if (err) {
console.error(err);
// should return response error like
return res.status(500).send();
}
var emailCheck = "SELECT id from public.user WHERE email=$1";
client.query(emailCheck, [req.body.email], function (err, result) {
if (err) {
console.error(err);
res.status(500).send();
return done(); // always close connection
}
if (result.rowCount > 0) {
let user = result.rows[0]
// return your user
return done(); // always close connection
} else {
var emailInsert = "insert into public.user (user_auth_level, email, account_locked, contract) " +
"values ('1', $1,'false','false') RETURNING *"
client.query(emailInsert, [req.body.email], function (err, result) {
if (err) {
console.error(err);
res.status(500).send();
return done(); // always close connection
} else {
if (result.rowCount > 0) {
let user = result.rows[0]
// return your user
return done(); // always close connection
}
}

});
}
})
})
pool.on('error', function (err, client) {
console.error('idle client error', err.message, err.stack)
});
}

关于node.js - 处理 Postgres 错误消息以执行正确的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40776251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com