使用猫鼬和node.js将标头发送到客户端后,无法设置标头

时间:2018-12-16 19:05:23

标签: javascript node.js express asynchronous mongoose

我正在尝试为用户提供注册功能。我想先检查电子邮件是否存在,如果存在,请返回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' });
    }
};

1 个答案:

答案 0 :(得分:0)

您尝试发送两次响应。

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' });
}