【问题标题】:Cannot set headers after they are sent to the client with mongoose and node.js使用 mongoose 和 node.js 将标头发送到客户端后无法设置标头
【发布时间】:2019-05-17 05:56:41
【问题描述】:

我正在尝试为用户创建注册功能。我想先检查邮件是否存在,如果存在则返回一个 json

{ message: 'cannot register a new user' }

或者一个带有确认和注册用户详细信息的 json。

这段代码工作正常,但是编译器说:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

问题似乎出在这一行:

res.status(200).json({ message: 'A new user was created!', user: result });

但我不知道如何修复它,所以它不会发出此消息

我的代码是:

const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');

const User = require('../models/user');

exports.signup = async (req, res, next) => {
    const firstname = req.body.firstname;
    const lastname = req.body.lastname;
    const email = req.body.email;
    const password = req.body.password;

    try {
        let canRegister = await User.findOne({ email: email })
            .then(user => {
                if (!user) {
                    return true;
                }
                res.status(400).json({ message: 'Email is already in use' });
            })
            .catch(err => {
                if (!err.statusCode) {
                    err.statusCode = 500;
                }
                next(err);
            });

        let addUser = await bcrypt
            .hash(password, 12)
            .then(hashedPw => {
                const user = new User({
                    firstname: firstname,
                    lastname: lastname,
                    email: email,
                    password: hashedPw
                });
                return user.save();
            })
            .then(result => {
                res.status(200).json({ message: 'A new user was created!', user: result });
            })
            .catch(err => {
                if (!err.statusCode) {
                    err.statusCode = 500;
                }
                next(err);
            });
    } catch {
        res.status(400).json({ message: 'Email is already in use' });
    }
};

【问题讨论】:

    标签: javascript node.js express asynchronous mongoose


    【解决方案1】:

    您正在尝试发送两次响应。

    let canRegister = await User.findOne({ email: email })
                .then(user => {
                    if (!user) {
                        return true;
                    }
    
                    // You might have executed this 1st - and continue.
                    res.status(400).json({ message: 'Email is already in use' });
                })
                .catch(err => {
                    if (!err.statusCode) {
                        err.statusCode = 500;
                    }
                    next(err);
                });
    

    但是你的代码没有退出。它移动到下一个区块。

    let addUser = await bcrypt
                .hash(password, 12)
                .then(hashedPw => {
                    const user = new User({
                        firstname: firstname,
                        lastname: lastname,
                        email: email,
                        password: hashedPw
                    });
                    return user.save();
                })
                .then(result => {
                    // Then you are sending status again with this line.
                    res.status(200).json({ message: 'A new user was created!', user: result });
                })
                .catch(err => {
                    if (!err.statusCode) {
                        err.statusCode = 500;
                    }
                    next(err);
                });
    

    您应该在分配canRegister 之后弄清楚(等待块完成)并在继续下一个块之前适当地返回。

    类似这样的:

    let canRegister = await User.findOne({ email: email })
                .then(user => {
                    if (!user) {
                        return true;
                    }
                    return false;
    
                    // Don't use the res.status here.
                })
                .catch(err => {
                    if (!err.statusCode) {
                        err.statusCode = 500;
                    }
                    next(err);
                });
    
    if (!canRegister) {
         return res.status(400).json({ message: 'Email is already in use' });
    } 
    

    【讨论】:

    • 干杯 @Karina 你介意接受这个作为答案吗 - 很感激绿色勾号!
    猜你喜欢
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    相关资源
    最近更新 更多