Mongoose обрабатывает дублирующиеся записи с неявной ошибкой - PullRequest
0 голосов
/ 02 мая 2018

Я хочу проверить, используется ли уже электронная почта или имя, когда я ввожу уже существующую электронную почту и существующее имя, возвращаются только данные из соответствующей электронной почты и никаких данных из имени. req.body.email is bob@gmail.com req.body.name is hansel

Account.find({$or: [ {user_email: req.body.email}, {display_name: req.body.name}]}) 
            .exec((err, user) => {
                if(err) { 
                    res.status(500).json({message: 'Internal Server Error', type: 'error'});
                }

                if(user) {
                     //  Only the data from the email match result is logged and no data for the already existing name
                     console.log(user)
                    // Response
                    res.json({
                        message: 'Account email address or Display name is already in use',
                        type: 'error'
                    })
                } else {
                    next();
                }
            });
        }

Я также заблудился, как я могу отправить ответ с явной ошибкой вроде The display name is already in use или The account email address is already in use вместо текущего ответа, который является неявным

Это из console.log (пользователь), он показывает только электронную почту совпадения, а не отображаемое имя совпадения

[ { _id: 5ae6cd68e1f3b32237494792,
    user_email: 'bob@gmail.com',
    display_name: 'Tetris',
    registration: 2018-04-30T08:01:44.095Z,
    __v: 0 } ]

Схема аккаунта

 const AccountSchema = new Schema({
        user_email: {
            type: String,
            required: true,
        },
        password: {
            type: String,
            required: true,
            select: false
        },
        display_name: {
            type: String,
            required: true,
        },
        registration: {
            type: Date,
            required: true,
        },
    });

1 Ответ

0 голосов
/ 02 мая 2018

Mongoose's .find всегда возвращает массив. Если ваш запрос не соответствует ни одному документу, он вернет пустой массив.

Пустой массив оценивается как true при любых условиях.

if ( [] ) { ... } else { // will never be called }

Вот почему ваш блок кода с next() никогда не вызывается.

if( user ) {
 // ^ user is either [] or [{...},...], so it's always true
} else {
     next();
}

Чтобы улучшить код, вы можете получить запрос findOne:

Account.findOne( { ... } ).then( user => {

    // user is either null or { ... }

} );

Или просто изменить

if ( user ) { ...

до

if ( user.length > 0 ) { ...

О том, с каким условием вы столкнулись, вы можете проверить

if ( user.length > 0 ) {
    res.json( {
        message : ( 
            user[0].user_email === req.body.email ? "Email" : "Display Name" 
        ) + " is already taken",
        error: true
    });
}

Но имейте в виду, что это не будет соответствовать ситуации, когда используются email и display name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...