我想检查电子邮件或名称是否已被使用,当我输入已存在的电子邮件和现有名称时,仅返回匹配电子邮件中的数据,且该名称中没有数据。
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 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,
},
});
答案 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
});
}
但请注意,这与使用email
和display name
的情况不符。