我正在创建用户身份验证&注册API,在register
端点我正在检查是否已存在提供用户名或电子邮件地址的用户。棘手的是,用户名不是必需的,因此它有时是未定义的。如果有任何现有用户使用undefined
用户名,并且有人尝试注册但未提供用户名(又名undefined
作为用户名),则会找到之前的undefined
用户,但不会让注册继续。
我如何查询:
如果用户名不是
,请找一位用户使用电子邮件地址[电子邮件地址]或用户名[username]undefined
这是我的路线(使用快递):
exports.register = (req, res, next) => {
const email = req.body.email.toLowerCase();
const username = (req.body.username) ? req.body.username.toLowerCase() : undefined;
const password = req.body.password;
const name = req.body.name;
// Return error if no email provided
if (!email) {
return res.status(422).send({ error: 'You must enter an email address.' });
}
if (!password) {
return res.status(422).send({ error: 'You must enter a password.' });
}
const queryUser = User.findOne({ $or: [{ email }, { username }] }).exec();
queryUser.then((existingUser) => {
if (existingUser) {
const field = (existingUser.email === req.body.email) ? 'email address' : 'username';
return res.status(422).send({ error: `A user with that ${field} already exists.` });
}
const user = new User({
email, password, username, name,
});
user.save().then((newUser) => {
const userInfo = setUserInfo(newUser);
res.status(201).json({
token: `JWT${generateToken(userInfo)}`,
user: userInfo,
});
}).catch(userErr => next(userErr));
}).catch(err => next(err));
return true;
};
我想如果没有定义用户名,我可以做一个不同的查询,如下所示:
let queryUser;
if (username) {
queryUser = User.findOne({ $or: [{ email }, { username: { $ne: undefined, username } }] }).exec();
} else {
queryUser = User.findOne({ email }).exec();
}
但我宁愿更多地了解如何使用Mongo来处理这类事情。
答案 0 :(得分:1)
或者您可以有条件地构建查询:
var query = { $or: [ { email } ] };
if ( req.body.hasOwnProperty('username') ) {
query.$or.push({ "username": { "$ne": req.body.username.toLowerCase() } }
}
queryUser = User.findOne(query).exec();
这些只是JavaScript对象,可以像任何其他对象一样进行操作。
这就是MongoDB查询语言基于标准数据结构格式的原因