Код не выполняется - Mongoose - Невозможно установить заголовки после их отправки клиенту

Я пытаюсь проверить, верно ли userlookUp в функции User.prototype.userExists на основе UserChema.findOne(), но по какой-то неизвестной причине блок не выполняется, если это правда. В этом случае return this.errors.push('Пользователь уже существует'), не выполняется.

У меня есть некоторые другие проверки ошибок в другой функции, и они отлично работают, как и предполагалось (показывая в консоли браузера), кроме этой.

Ищу помощи.

Я ценю его.

userController.js

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

exports.login = function () {};
exports.logout = function () {};
exports.register = function (req, res) {
    let user = new User(req.body);
    user.register();
    if (user.errors.length) {
        res.send(user.errors);
    } else {
        res.send(user);
        res.send('Congrats, there are no errors.');
    }
};
exports.home = function (req, res) {
    res.send('API up and running!');
};

User.js

const validator = require('validator');
const UserSchema = require('./UserSchema');
const gravatar = require('gravatar');
const bcrypt = require('bcryptjs');

let User = function (data) {
    this.data = data;
    this.errors = [];
};

User.prototype.cleanUp = function () {
    if (typeof this.data.username != 'string') {
        this.data.username = '';
    }
    if (typeof this.data.email != 'string') {
        this.data.email = '';
    }
    if (typeof this.data.password != 'string') {
        this.data.password = '';
    }

    // get rid of any bogus properties

    this.data = {
        username: this.data.username.trim().toLowerCase(),
        email: this.data.email.trim().toLowerCase(),
        password: this.data.password,
    };
};

User.prototype.validate = function () {
    if (this.data.username == '') {
        this.errors.push('You must provide a username.');
    }
    if (
        this.data.username != '' &&
        !validator.isAlphanumeric(this.data.username)
    ) {
        this.errors.push('Username can only contain letters and numbers.');
    }
    if (!validator.isEmail(this.data.email)) {
        this.errors.push('You must provide a valid email.');
    }
    if (this.data.password == '') {
        this.errors.push('You must provide a password longer than 6 characters.');
    }
    if (this.data.password.length > 0 && this.data.password.length < 6) {
        this.errors.push('The password must be longer than 6 characters.');
    }
    if (this.data.password.length > 50) {
        this.errors.push('The password cannot exceed 50 characters.');
    }
    if (this.data.username.length < 3 && this.data.username.length > 15) {
        this.errors.push('The username must be at least 3 characters.');
    }
};

User.prototype.userExists = async function () {
    try {
        let userLookUp = await UserSchema.findOne({
            email: this.data.email,
        });
        if (userLookUp) {
            return this.errors.push('User already exists');
        } else {
            const avatar = gravatar.url(this.data.email, {
                s: '200',
                r: 'pg',
                d: 'mm',
            });

            userLookUp = new UserSchema({
                username: this.data.username,
                email: this.data.email,
                password: this.data.password,
                avatar: avatar,
            });

            const salt = await bcrypt.genSalt(10);

            userLookUp.password = await bcrypt.hash(this.data.password, salt);

            await userLookUp.save();
        }
    } catch (e) {
        console.log('there is a server problem');
    }
};

User.prototype.register = function () {
    // Step #1: Validate user data
    this.cleanUp();
    this.validate();
    this.userExists();

    // Step #2: See if user exists

    // Step #3: Get users gravatar

    // Step #4: Encrypt the password

    // Step #5: Return jsonwebtoken
    // Step #6: Only if there are no validation errors
    // then save the user data into a database
};

module.exports = User;

В функции User.register вы запускаете некоторые функции, которые являются обещаниями (функции async), которые не выполняются до возврата из функции User.register.

Titus 22.04.2022 21:40

не могли бы вы быть немного более конкретным. добавление async в User.register и ожидание в this.userExists() не решает проблему.

Alaris 22.04.2022 21:56
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
0
2
14
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В функции User.register вы запускаете некоторые функции, которые являются обещаниями (функции async), которые не выполняются до возврата из функции User.register.

Вы можете сделать что-то вроде этого:

User.prototype.register = async function () {
    this.cleanUp();
    this.validate();
    await this.userExists();
};

...

exports.register = async function (req, res) {
    let user = new User(req.body);
    await user.register();
    if (user.errors.length) {
        res.send(user.errors);
    } else {
        res.send(user);
        res.send('Congrats, there are no errors.');
    }
};

Решил проблему! Спасибо

Alaris 23.04.2022 12:28

Другие вопросы по теме