我已实施限制'并且'跳过'查询我的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.
将这些查询合并而没有错误的方法是什么?
答案 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
两次的错误。
但您甚至不需要重复发出查询的代码。只需使用任一种方法“一次”即可。