【问题标题】:I'm getting "Cannot set headers after they are sent to the client"我收到“发送到客户端后无法设置标题”
【发布时间】:2021-03-30 05:40:09
【问题描述】:

据我所知,当我发送响应时,注册功能并没有结束!我尝试将 return 与 res 并仍然有同样的问题!

const connection = require("../../db");
const bcrypt = require("bcrypt");


const register = (req, res) => {

    const { user_name, password, phone, email } = req.body;
    const role_id = 0;
    var dateObj = new Date();
    const month = dateObj.getUTCMonth() + 1;
    const day = dateObj.getUTCDate();
    const year = dateObj.getUTCFullYear();
    const created_at = year + "/" + month + "/" + day;
    const is_disabled = 0

    // Cheacking if there is no email or user name in the database.
    let query = `SELECT * from users WHERE email = '${email}' OR user_name ='${user_name}' `;
    connection.query(query, (err, result) => {
        if (err) throw err;
        if (result.length) {
            if (email === result[0].email) {
                return res.json("Email is already used.")
                
            } else {
                return res.json("User name is already used.")
            };
        };
    });
    //Hashing the password.
    const hashPassword = bcrypt.hashSync(password, Number(process.env.SALT), (err, result) => {
        if (err) throw err
    });

    // Adding new user to database.
    query = `insert INTO users (email,phone,password,user_name,role_id,created_at,is_disabled) VALUES('${email}','${phone}','${hashPassword}','${user_name}','${role_id}','${created_at}','${is_disabled}')`
    connection.query(query, (err, result) => {
        if (err) throw err
    })
    return res.json("Added user")
}
module.exports = register

错误 [ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置标头

【问题讨论】:

  • 警告:不要使用字符串插值来注入数据,始终使用 占位符值。这有严重的 SQL 注入错误。
  • 您可能有两个res.json() 语句正在发生...res.json("Email is already used.")res.json("User name is already used.") 然后res.json("Added user") - return 语句对于第一个到res.json 的人不会终止 register 函数,它们只是终止当前回调函数
  • @tadman 我的老师让我这样做,但他没有告诉我为什么,现在我明白了,谢谢
  • 我会将//Hashing the password.else 中的所有内容放在if (result.length) { 语句中......即if (result.length) { .... blah blah } else { //Hashing the password. etc }(实际上,它不必在else 中完全没有,因为你 returnif) .... 所以 ... 将所有内容从 //Hashing the password. 移动到该函数的末尾,在该行上方的 });
  • 我同意@Jaromanda X,node.js 中的 i/o 任务(包括网络和数据库任务,磁盘 i/o 任务)是异步的,你应该使用 async/await 来解决这个问题。

标签: javascript mysql node.js


【解决方案1】:

您应该在回调中移动密码哈希/新用户代码,因为这些必须仅在电子邮件/用户名检查完成后才会发生。否则,您将异步检查冲突创建帐户;可能会导致尝试将多个响应发送回客户端。

const register = (req, res) => {

    const { user_name, password, phone, email } = req.body;
    const role_id = 0;
    var dateObj = new Date();
    const month = dateObj.getUTCMonth() + 1;
    const day = dateObj.getUTCDate();
    const year = dateObj.getUTCFullYear();
    const created_at = year + "/" + month + "/" + day;
    const is_disabled = 0

    // Cheacking if there is no email or user name in the database.
    let query = `SELECT * from users WHERE email = '${email}' OR user_name ='${user_name}' `;
    connection.query(query, (err, result) => {
        if (err) throw err;
        if (result.length) {
            if (email === result[0].email) {
                return res.json("Email is already used.")
                
            } else {
                return res.json("User name is already used.")
            };
        };

        //Hashing the password.
        const hashPassword = bcrypt.hashSync(password, Number(process.env.SALT), (err, result) => {
            if (err) throw err
        });

        // Adding new user to database.
        query = `insert INTO users (email,phone,password,user_name,role_id,created_at,is_disabled) VALUES('${email}','${phone}','${hashPassword}','${user_name}','${role_id}','${created_at}','${is_disabled}')`
        connection.query(query, (err, result) => {
            if (err) throw err
        })
        return res.json("Added user")
    });
}

【讨论】:

    猜你喜欢
    • 2021-09-11
    • 2018-05-25
    • 2021-06-27
    • 2020-11-01
    • 2020-11-14
    • 2020-09-05
    • 2019-02-06
    • 2020-05-20
    相关资源
    最近更新 更多