Expressjs:搜索查询api

bod*_*ser 5 javascript mongoose express

我想用查询字符串在我的用户存储库中搜索.

这应该返回所有用户名为"kyogron"的用户和类似的电子邮件"kyogron @gmail"

GET localhost:3000/users?username=kyogron&email=kyogron@gmail.com
Run Code Online (Sandbox Code Playgroud)

这应该返回所有用户:

GET localhost:3000/users
Run Code Online (Sandbox Code Playgroud)

我已经设法处理路由参数,但我坚持优化它:

app.get('/users', function(req, res) {
    // creates a mongoosejs query object
    var query = User.find({});

    // to understand how expressjs handles queries:
    // ?username=kyogron&email=kyogron@gmail.com
    // { username: "kyogron", email: "kyogron@gmail.com" }
    //console.log(req.query);

    // this was one idea of optimizing the search query parameters
    // this doesn't work don't know why I always get an array of ALL users
    // even the key and value is right
    Object.keys(req.query).forEach(function(key) {
        query.select(key, req.query[key]);
    });

    // this was the way I was first handling the parameters, this works !!
    //if (req.query.username) query.where('username', req.query.username);
    //if (req.query.email) query.where('email', req.query.email);

    // the rest of the query
    query.select('username', 'email');
    query.exec(function(err, users) {
        if (err) throw err;
        res.json(users);
    });

});
Run Code Online (Sandbox Code Playgroud)

这些是我正在与之抗争的问题:

  1. 为什么不迭代req.query对象呢?
  2. 我怎么说猫鼬使用通配符(例如kyo*)

如果有人可以帮助我:)会很好:)

问候

编辑:

第二个问题可以通过$解决:

    if (req.query.username) {
        query.$where(function() {
            return this.username === req.query.username; // here we need a regex check
        });
    }
Run Code Online (Sandbox Code Playgroud)

Thos不起作用......有人可以给我一个暗示吗?

EDIT2:

没有用$ where管理任何东西......但我现在找到了

query.where('username').regex();
Run Code Online (Sandbox Code Playgroud)

我只需要寻找一个寻找类似单词的搜索正则表达式

EDIT3:

我找到了这个帖子:如何用"喜欢"查询MongoDB?我问mongoosejs小组我怎么能用猫鼬做这件事

EDIT4:

if (req.query.username) {
            query.where('username').regex(new RegExp("\/"+req.query.username+"\/"));
}
Run Code Online (Sandbox Code Playgroud)

我几乎得到了它.只需修复这个愚蠢的正则表达式......

bod*_*ser 1

app.get('/users', function(req, res) {
    var query = User.find({});

    Object.keys(req.query).forEach(function(key) {
        query.where(key).regex(new RegExp(req.query[key]));
    });

    /*
    if (req.query.username) {
        query.where('username').regex(new RegExp(req.query.username));
    }
    if (req.query.email) {
        query.where('email').regex(new RegExp(req.query.email));
    }*/

    query.select('username', 'email');
    query.exec(function(err, users) {
        if (err) throw err;
        res.json(users);
    });

});
Run Code Online (Sandbox Code Playgroud)

第一个不起作用,因为我有一个拼写错误(.select() 而不是 .where())。第二个是在额外的线程中找到的

我对所选择的方法仍然有点不确定。

迭代 req.query 将使代码可重用(可能作为路由参数函数的前提条件),但它很容易出错