Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在使用nodejs mysql将头发送到客户端后,无法设置头_Javascript_Mysql_Node.js_Api_Express - Fatal编程技术网

Javascript 在使用nodejs mysql将头发送到客户端后,无法设置头

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

我试图做的是编写一条语句,在用户注册时检查我的mysql数据库中是否存在电子邮件。在postman中,它向我发送了正确的错误消息“user ready take”,但是服务器在发送后崩溃,并显示“发送到客户端后无法设置标题”。我读过类似的帖子,但没有提供帮助

//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
函数,这有效地消除了两个函数之间的竞争条件。

。就这样。真不敢相信我忽略了那部分。学习永不停止!多谢各位