Невозможно установить заголовки после их отправки клиенту с помощью mongoose и node.js - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь сделать функцию регистрации для пользователей.Сначала я хочу проверить, существует ли электронная почта, если да, вернуть 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 голосов
/ 16 декабря 2018

Вы пытаетесь отправить ответ дважды.

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' });
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...