Javascript 在使用nodejs mysql将头发送到客户端后,无法设置头
我试图做的是编写一条语句,在用户注册时检查我的mysql数据库中是否存在电子邮件。在postman中,它向我发送了正确的错误消息“user ready take”,但是服务器在发送后崩溃,并显示“发送到客户端后无法设置标题”。我读过类似的帖子,但没有提供帮助Javascript 在使用nodejs mysql将头发送到客户端后,无法设置头,javascript,mysql,node.js,api,express,Javascript,Mysql,Node.js,Api,Express,我试图做的是编写一条语句,在用户注册时检查我的mysql数据库中是否存在电子邮件。在postman中,它向我发送了正确的错误消息“user ready take”,但是服务器在发送后崩溃,并显示“发送到客户端后无法设置标题”。我读过类似的帖子,但没有提供帮助 //The following code is in my user.service.js file: const pool = require("../../config/database"); module.ex
//The following code is in my user.service.js file:
const pool = require("../../config/database");
module.exports = {
//Create new user
createUser: (data, callBack) =>{
pool.query(
`insert into registration(name, email, password, confirm_password)
values(?,?,?,?)`,
[
data.name,
data.email,
data.password,
data.confirm_password
],
(error, results, fields) =>{
if(error){
return callBack(error);
}
return callBack(null, results);
}
);
}
}
//以下代码在我的user.controller.js文件中:
const {
createUser,
} = require("./user.service");
const pool = require("../../config/database");
module.exports = {
createUser: (req, res) =>{
const body = req.body;
const salt = genSaltSync(10);
pool.query('SELECT email FROM registration WHERE email = ?', [body.email], (error, results) =>{
if(error){
console.log(error);
}
if(results.length > 0){
return res.status(400).json({
message: 'User already taken'
})
}
})
createUser(body, (err, results) => {
if(err){
console.log(err);
return res.status(500).json({
success:0,
message:"Error in database connection"
});
}
return res.status(200).json({
success: 1,
message: `User ${results.insertId} signed up successfully`,
data: results
});
});
}
const {
createUser,
} = require("./user.controller");
const router = require("express").Router();
router.post("/signup", createUser);
module.exports = router;
}
//以下代码来自user.router.js文件:
const {
createUser,
} = require("./user.service");
const pool = require("../../config/database");
module.exports = {
createUser: (req, res) =>{
const body = req.body;
const salt = genSaltSync(10);
pool.query('SELECT email FROM registration WHERE email = ?', [body.email], (error, results) =>{
if(error){
console.log(error);
}
if(results.length > 0){
return res.status(400).json({
message: 'User already taken'
})
}
})
createUser(body, (err, results) => {
if(err){
console.log(err);
return res.status(500).json({
success:0,
message:"Error in database connection"
});
}
return res.status(200).json({
success: 1,
message: `User ${results.insertId} signed up successfully`,
data: results
});
});
}
const {
createUser,
} = require("./user.controller");
const router = require("express").Router();
router.post("/signup", createUser);
module.exports = router;
在对post请求执行的
createUser
函数中,您正在做两件事。首先,检查是否存在具有提供的电子邮件的用户,然后,创建一个用户。但是,这些函数不是连续执行的,而是同时运行的,因此会创建竞争条件
因此,在您的示例中,如果电子邮件检查查询从注册中选择电子邮件,其中电子邮件=?
更快,并且用户已经存在,它将响应:
return res.status(400).json({
message: 'User already taken'
})
但是createUser
函数(如下)仍在运行,一旦完成,它将尝试发送响应。因此,在控制台中会出现应用程序崩溃,即使在postman中,您可以看到声明用户已经存在的响应
为了修复此错误,仅当results.length
在提供给电子邮件检查查询的回调中为0
时,才应执行createUser
函数,如下所示:
createUser: (req, res) => {
const body = req.body;
const salt = genSaltSync(10);
pool.query('SELECT email FROM registration WHERE email = ?', [body.email], (error, results) =>{
if(error){
console.log(error);
}
if(results.length > 0){
return res.status(400).json({
message: 'User already taken'
})
}
createUser(body, (err, results) => {
if(err){
console.log(err);
return res.status(500).json({
success:0,
message:"Error in database connection"
});
}
return res.status(200).json({
success: 1,
message: `User ${results.insertId} signed up successfully`,
data: results
});
});
})
}
现在,仅当提供电子邮件的用户不存在时,才执行
createUser
函数,这有效地消除了两个函数之间的竞争条件。。就这样。真不敢相信我忽略了那部分。学习永不停止!多谢各位