不总是提供参数查询

时间:2017-06-09 22:15:29

标签: javascript mongodb

我正在创建用户身份验证&注册API,在register端点我正在检查是否已存在提供用户名或电子邮件地址的用户。棘手的是,用户名不是必需的,因此它有时是未定义的。如果有任何现有用户使用undefined用户名,并且有人尝试注册但未提供用户名(又名undefined作为用户名),则会找到之前的undefined用户,但不会让注册继续。

我如何查询:

  

如果用户名不是undefined

,请找一位用户使用电子邮件地址[电子邮件地址]或用户名[username]

这是我的路线(使用快递):

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来处理这类事情。

1 个答案:

答案 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查询语言基于标准数据结构格式的原因