Mongoose处理具有隐式错误的重复条目

时间:2018-05-02 07:40:56

标签: node.js mongodb express mongoose

我想检查电子邮件或名称是否已被使用,当我输入已存在的电子邮件和现有名称时,仅返回匹配电子邮件中的数据,且该名称中没有数据。 req.body.email是bob@gmail.com req.body.name是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 useThe 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 :(得分:1)

Mongoose的.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
    });
}

但请注意,这与使用emaildisplay name的情况不符。