繁体   English   中英

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

[英]Cannot set headers after they are sent to the client with mongoose and node.js

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

您尝试发送两次响应。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM