为节点中的api重载函数 - 最佳实践?

时间:2014-08-08 21:48:36

标签: node.js rest

我目前正在构建一个小型快速支持的节点应用,以便为我写的节点模块中的RESTful API提供数据。模块中的一个函数有三个参数,但我想通过只指定一个,两个,另外两个或所有三个参数来允许使用API​​。

所以即使开始写这样的路线也已经很荒谬了。

app.get('/api/monitor/:stop/:numresults', apiController.monitorNum);
app.get('/api/monitor/:stop/:timeoffset', apiController.monitorOff);
app.get('/api/monitor/:stop', apiController.monitor);

特别是因为我不知道如何指定前两者之间的差异,因为numresults和timeoffset都只是整数。

在这种情况下,最佳做法是什么样的?

2 个答案:

答案 0 :(得分:1)

你面临的第一个问题是你有相同的路线,如果你使用快递是不可能的(我假设你正在使用它)。相反,您可能需要一条路线并改为使用查询对象:

app.get('/api/monitor/:stop/', function (req, res, next) {
    var stop = req.params.stop,
        numResults = req.query.numResults,
        timeOffset = req.query.timeOffset;

    yourFunc(stop, numResults, timeOffset);
});

这样你就可以使用以下网址调用api:http://example.com/api/monitor/somethingAboutStop/?numResults=1&timeOffset=2。看起来stop参数也可以移动到查询对象,但这取决于你。

答案 1 :(得分:0)

您可以使用catchall路线然后自己解析。

示例:

app.get('/api/monitor/*', apiController.monitor);

然后在apiController.monitor中你可以进一步解析url:

exports.monitor = function(req, res) {

    var parts = req.url.split('/');
    console.log(parts);        // [ '', 'api', 'monitor', '32', 'time' ]
    console.log(parts.length); // 5

    res.end();
};

所以,点击/ api / monitor / 32 /时间,就可以得到上面的那个数组了。点击/ api / monitor / something / very / long / which / you / can / parse,你可以看到每个参数的去向。

或者您可以自助,例如/api/monitor/page/32/offset/24/maxresults/14/limit/11/filter/by-user

尽管如Deif已经告诉过你的那样,你通常会对查询参数进行分页,maxResults&页面是你常用的参数。