有条件地使用请求参数进行跳过和限制

时间:2017-11-07 23:40:42

标签: node.js mongodb mongoose

我已实施限制'并且'跳过'查询我的restful API。

如果我尝试

' localhost:4000 / api / users?skip = 60' ,它会跳过我数据中的前60项

' localhost:4000 / api / users?limit = 5' ,只返回5个数据

然后结合这两个

' localhost:4000 / api / users?skip = 60& limit = 5' 将跳过前60个数据,并从该点返回5个数据。

我的跳过和限制实现为:

router.get('/', function(req, res) {

    var skipping = req.query.skip;
    var limiting = req.query.limit;

    // skipping

    if(skipping != null){
        user.find({})
        .skip(3)
        .exec(function(err, users) {
            if(err){
                res.status(404).send({
                    message: err,
                    data: []
                });
            } else {
                res.status(200).send({
                    message: 'OK skipped',
                    data: users
                });
            }
    });
    }

    // limit

    else if(limiting != null){
        user.find({})
        .limit(parseInt(limiting))
        .exec(function(err, users) {
            if(err){
                res.status(404).send({
                    message: err,
                    data: []
                });
            } else {
                res.status(200).send({
                    message: 'OK limited',
                    data: users
                });
            }
    });
    }
  }
});

它们中的每一个都运行良好,但是当我尝试通过chaning else将它们组合起来if if if时,应用程序崩溃发出消息

Error: Can't set headers after they are sent.

将这些查询合并而没有错误的方法是什么?

1 个答案:

答案 0 :(得分:2)

不要为每个参数更改重写代码。 .skip().limit()修饰符基本上修改了“光标”并且可以“链接”。更具体地说,使用mongoose它们会返回dist个对象,在发布之前,您只需“链接” .exec()。或者只是使用“默认值”:

使用默认值:

Query

或“链接”:

router.get('/', function(req, res) {

    var skipping = parseInt(req.query.skip) || 0;
    var limiting = parseInt(req.query.limit) || 0;

    user.find().skip(skipping).limit(limiting).exec(...);

})

这是“方法链”,你实际上一直使用“所有的时间”,只是你没有意识到你正在使用它。例如,没有router.get('/', function(req, res) { var skipping = req.query.skip; var limiting = req.query.limit; let query = user.find(); // Chain skip if (skipping != undefined) // purely since 0 is "falsey" query = query.skip(parseInt(skipping)); // Chain limit if (limiting != undefined) query = query.limit(parseInt(limiting)); // Then exec query.exec(...); }) 条件:

if

完全与写作相同:

let query = user.find().skip(0).limit(0);

在第一种形式中,每个“修饰符”let query = user.find(); query = query.skip(0); query = query.limit(0); find()skip() ALL根据给定的输入对象返回limit()个对象。它们“返回到左侧”,因为它们只是Query,这使您能够“链接”。因此,就实际分配而言,“单独”分配作业是“完全相同的事情”

无论如何,function值都存在,或者req.params undefined正如您目前正在尝试的那样。因此,调用null 两次的错误。

但您甚至不需要重复发出查询的代码。只需使用任一种方法“一次”即可。