在节点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语句后仍不能停止工作?
预先感谢:)
答案 0 :(得分:0)
有问题的行位于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,如果计划部署此代码,则应绝对解决。