我希望我的API支持对我的mongodb模型的不同属性进行过滤。我将使用的蛮力方式:
app.get('/api/thing/:id', thing.getThingById);
app.get('/api/thing/:name, thing.getThingByName);
app.get('/api/thing/:name/:color', thing.getThingByNameAndColor);
等。这种方法显然很糟糕。如何添加单个路径来捕获多个参数,以便我可以使用
之类的内容返回things
exports.getThingByParams = function (req, res, next) {
var query = thingModel.find (req.params);
query.exec (function (err, things) {
if (err) return next (err);
res.send ({
status: "200",
responseType: "array",
response: things
});
});
};
答案 0 :(得分:1)
使用URL查询字符串。它是为这个用例发明的一组名称/值对。尽管目前的趋势是一切都必须在URL的路径部分而不是查询字符串,所以这些年后它仍然很好用,因为???看看你的路线 - 它甚至在其中说“API”。根据赶时髦的人的说法,它不需要滥用这条“漂亮”的路径。
app.get('/api/thing', thing.search);
exports.search = function (req, res, next) {
//Remember any ID values need to be converted from strings to ObjectIDs,
//and there's probably additional sanitization/normalization to do here
var query = thingModel.find (req.query);
query.exec (function (err, things) {
if (err) return next (err);
res.send ({
status: "200",
responseType: "array",
response: things
});
});
};
然后找到一个名为candy的红色东西的网址看起来像
/api/thing?color=red&name=candy
答案 1 :(得分:0)
app.get('/api/thing/:name/:color', thing.getThingByProperty);
并且在getThingByProperty内部只需测试req.params.YourParam(名称或颜色)并决定该怎么做。如果请求颜色但不是名称,则按以下方式发送URL:
/api/thing/-/red.
非常常见的是在路线中使用空参数表示为破折号。
OR,不同的方法,更好的模式更像API(RESTFul)是:
/api/thing/:id that's by id and to offer pattern support
并且针对不同的属性搜索使用:
/api/things/search?property1=value&property2=value
这样你就可以尊重API中的集合模式(/ api / things),并将搜索放在查询中以保持灵活性。在req.query.property1或属性的搜索回调内部进行测试,并相应地采取行动