【问题标题】:How to implement query parameters in Postman with mongoosePostman 中如何使用 mongoose 实现查询参数
【发布时间】:2018-04-14 19:36:19
【问题描述】:

我有一个包含驱动程序架构的 driver.js。还有 driverController.js,其中包含我的休息方法。获取、发布、删除和放置。

我想做的是

GET - http://localhost:3000/drivers?available=true

并让它返回所有可用的驱动程序。

我的驱动程序架构如下所示:

var mongoose = require('mongoose');
var DriverSchema = new mongoose.Schema({
    name: String,
    available: Boolean,
    latitude: Number,
    longitude: Number
});
mongoose.model('Driver', DriverSchema);
module.exports = mongoose.model('Driver');

我看了一些documentation,但我什么都做不了。

这是我尝试添加参数的 GET 方法

// GETS ALL DRIVERS FROM THE DATABASE
router.get('/', function (req, res) {
    Driver.find({}, function (err, driver) {
        if (err) return res.status(500).send("There was a problem finding the drivers.");
        var available = req.query.available;
        if (available == driver.available )
            res.status(200).send(available );
        else
            res.status(200).send("Nice! " + driver.available);
    });
});

这种比较是行不通的。它总是转到 else 语句。我不太清楚为什么,但输出是“Nice!未定义”即使我的数据库中有很多驱动程序,如果我只放在 else 语句中 res.status(200).send("不错!" + driver); 然后它给了我驱动程序列表。

不过,我希望能够使用查询参数来查找驱动程序。

任何提示或提示将不胜感激,因为这是一个项目,我以前从未使用过 restAPI 或 javascript。谢谢!

注意:猫鼬,快递。 node.js 和 mongoDB 正在使用中。

【问题讨论】:

    标签: javascript node.js mongodb rest express


    【解决方案1】:

    如果我只放入 else 语句 res.status(200).send("Nice!" + driver);然后它给了我驱动程序列表。

    这是一个驱动程序列表,if (available == driver.available ) 您将boolean 与对象数组进行比较,

    不要获取所有驱动程序并检查它们是否有 availabe == true ,而是将条件添加到 .find() 并返回结果:

    // GETS ALL DRIVERS FROM THE DATABASE
    router.get('/', function (req, res) {
        Driver.find({ available : req.query.available }, function (err, drivers) {
            if (err) return res.status(500).send("There was a problem finding the drivers.");
            res.status(200).send(drivers);
        });
    });
    

    编辑:

    您可以这样做以根据查询字符串添加过滤器:

    // GETS ALL DRIVERS FROM THE DATABASE
        router.get('/', function (req, res) {
            var params = {};
            Object.keys(req.query).forEach((v, k) => params[k] = v);
    
            Driver.find(params, function (err, drivers) {
                if (err) return res.status(500).send("There was a problem finding the drivers.");
                res.status(200).send(drivers);
            });
        });
    

    拥有?name=Wario&available=true 将创建一个类似{ name : 'wario', available : true 的对象并将其传递给.find()

    【讨论】:

    • 非常感谢您的快速回复!我有一个问题,但是,这似乎限制了我的 GET 方法的灵活性,因为现在我无法获得所有用户。如果我只是用“/drivers”调用get方法但我也想知道,我是否可以这样做以便我也可以按名称搜索,或者只使用架构中属性的任意组合
    • 将过滤器应用于您的find() 并不意味着它变成LIMITED 而是Optimized,因为您没有从数据库中获取不需要的数据,是的,您可以添加任意数量的过滤器,例如 { available : req.query.available , name : req.query.name } ...等。
    • 很公平。当我的意思是有限时,它似乎必须变得非常具体。例如,如果我要添加上面架构中的所有属性,那么看起来我不能再仅按名称搜索。我必须知道所有的价值观,对吧?有没有办法让我能够添加所有参数并且仍然可以选择一两个搜索?如:GET - localhost:3000/drivers?name=Wario&available=true
    • 我添加了一些 if 语句 [if (req.query.name).. 等等,这回答了我的问题。谢谢!!!
    猜你喜欢
    • 1970-01-01
    • 2017-04-30
    • 2016-09-08
    • 2021-10-22
    • 2021-01-16
    • 2015-11-24
    • 2022-11-23
    • 2015-07-22
    • 2022-10-26
    相关资源
    最近更新 更多