单一快速路线捕获所有可能的参数组合

时间:2014-04-24 15:06:34

标签: node.js express

我希望我的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
      });
  });
};

2 个答案:

答案 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或属性的搜索回调内部进行测试,并相应地采取行动