Javascript 在express.js中,为什么代码在return语句之后仍然执行

Javascript 在express.js中,为什么代码在return语句之后仍然执行,javascript,node.js,postgresql,express,Javascript,Node.js,Postgresql,Express,在NodeJS中,我有以下代码 const express = require('express'); const pool = require('../db'); const bcrypt = require('bcryptjs'); const router = express.Router(); const { registerValidation } = require('../validation') const { sendEmail } = require('./sendEmai

在NodeJS中,我有以下代码

const express = require('express');
const pool = require('../db');
const bcrypt = require('bcryptjs');

const router = express.Router();
const { registerValidation } = require('../validation')
const { sendEmail } = require('./sendEmail')

router.post("/", async(req, res) => {
  // LETS VALIDATE THE DATA BEFORE MAKE A USER and it comes from validation.js file
    const { error } = registerValidation(req.body);
    if (error) return res.status(400).send(error.details[0].message);

  // If the user already exists
  pool.query("select email from users where email='"+req.body.email+"'", function(err, data){
    if(data.rows.length > 0) {
      return res.status(400).send("This email already exists");
    }
  })

  // Hash password
  const salt = await bcrypt.genSalt(10);
  const hashedPassword = await bcrypt.hash(req.body.password, salt);

  try{
      const { name, username, email, verified, token, recieveEmail, gender } = req.body;        
      const newUser = await pool.query("INSERT INTO users (name, username, email, verified, token, password, recieveEmail, gender) VALUES($1, $2, $3, $4, $5, $6, $7, $8) RETURNING *", 
      [name, username, email, verified, token, hashedPassword, recieveEmail, gender]);

      const { error } = sendEmail(req.body.email);
      if (!error){
        return res.status(400).send("Email could not be sent");
      }
      res.json(newUser.rows);
  }catch(err){
      console.error(err.message)
  }
})

module.exports = router;
如果我尝试使用用户表中已存在的重复电子邮件id,则会显示错误消息此电子邮件已存在,同时将数据插入用户表,并将电子邮件发送到给定的电子邮件地址。这意味着代码仍然在return语句之后执行

我想知道它为什么在找到返回语句时不停止工作


提前感谢:)

相关行已在内部传递到
pool.query()
。这意味着,当代码执行到达
pool.query()
时,它会立即继续执行,导致您看到的行为

当回调返回时,它只是结束回调本身的执行,并在此时独立于代码的主序列运行

pool.query(“选择来自用户的电子邮件,其中电子邮件=”+req.body.email+”,
//回拨vvv
功能(错误、数据){
如果(data.rows.length>0){
返回res.status(400)。发送(“此电子邮件已存在”);
}
}
);


注意:正如其他地方提到的,这里的代码是一个非常巨大的安全漏洞,因为您在对数据库的调用中直接执行传入的、可能不安全的请求数据。它被称为a,如果您计划部署此代码,则绝对应该解决它。

pool.query()
需要回调,因为它是一个异步操作。您需要移动回调函数中所有剩余的代码,以便它在查询完成后运行。(你也可以重写你的
db.js
文件,这样它会返回一个承诺,解析查询结果,
等待查询调用。)不要
“从用户那里选择email=”“+req.body.email+”””
,它会打开你自己的SQL注入,准备好的查询是内置的。。do
“从电子邮件=?
的用户中选择电子邮件,然后选择
pool.query(“…”,[req.body.email],func
TL;DR:
return
语句在回调函数中,而不是在route handler function.email字段中;
”;DROP TABLE users;