【问题标题】:In express.js why does code still execute after return statement在express.js中为什么代码在return语句之后仍然执行
【发布时间】:2021-01-16 14:02:03
【问题描述】:

在 node js 中,我有以下代码

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语句之后代码还在执行。

我想知道为什么它在找到return语句时没有停止工作?

提前致谢:)

【问题讨论】:

  • pool.query() 需要回调,因为它是异步操作。您需要将所有剩余的代码移动到内部回调函数中,以便它在查询完成后运行。 (您也可以重写 db.js 文件,使其返回解析为查询结果的 Promise 和 await 查询调用。)
  • 不要做"select email from users where email='"+req.body.email+"'",它会让你自己接受SQL注入,内置的准备好的查询..做"select email from users where email=?然后pool.query("...", [req.body.email], func
  • TL;DRreturn 语句在回调函数中,而不是在路由处理函数中。

标签: javascript node.js postgresql express


【解决方案1】:

有问题的行在a callback function 内传递给pool.query()。这意味着代码执行,当它到达pool.query()立即继续执行,导致你看到的行为。

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

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

注意:正如在其他地方提到的,这里的代码是一个相当大的安全漏洞,因为您在调用数据库时直接执行传入的、可能不安全的请求数据。它被称为SQL injection attack,如果您打算部署此代码,您绝对应该解决它。

【讨论】:

  • 电子邮件字段; ';DROP TABLE users;--
猜你喜欢
  • 2016-09-15
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
相关资源
最近更新 更多