javascript - 查询时并不总是提供参数

标签 javascript mongodb

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

如何查询:

Find one user with the email address [email address] OR with the username [username] if the username is not undefined

这是我的路线(使用 express ):

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

最佳答案

或者您可以有条件地构建查询:

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

关于javascript - 查询时并不总是提供参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44467383/

相关文章:

javascript - 创建 javascript 对象属性时出错

node.js - 如何获取mongoose/mongodb中数组中除了我们传递的元素之外的元素?

mongodb - 从 shell 脚本连接中运行 MongoDB shell 命令被拒绝

javascript - 如何用js设置input元素值时触发change事件

javascript - HTML5 语音合成

Django MongoDB 查询集无法打印或迭代

java - 如何使用 Spring 的 MongoTemplate 和 Query 类检索字段子集?

javascript - 通过 mongoDB 集合查询需要什么?

Javascript - 本地存储 - 删除项目不起作用

javascript - jQuery:鼠标悬停使图像可见,其 id 中的最后 4 个数字与触发器相同