5

我们需要暴露 REST 端点。共有三个参数,如何使它们成为可选参数。要求是它应该与这些参数中的任何一个一起使用。

例如http://server:port/v1/api/test-api/userId/UnameName/userEmail

app.get('v1/api/test-api/:userId/:userName/:userEmail', function(req, res){

});

当我们通过传递所有三个参数进行调用时,它工作正常。但是我们希望通过仅传递 userId 或这三个参数中的任何一个来使其工作。当我们传递较少的参数时,它会给出错误Cannot GET /v1/api/test-api/test5/123

如何在公开端点时使参数可选?

4

4 回答 4

10

您需要像这样构建路线:

app.get('path/:required/:optional?*, ...)
于 2014-06-10T00:58:53.730 回答
8

更好的解决方案是使用 GET 参数,例如调用

http://server:port/v1/api/test-api?userId=123&userName=SomeKittens&userEmail=kittens%40example.com

然后,您可以定义您的路线,例如:

app.get('v1/api/test-api', function(req, res){
  var userName = req.query.userName;
  var userEmail = req.query.userEmail;
  var userId = req.query.userId;

  // Do stuff
});

不要忘记包括body-parser示例

于 2014-06-10T01:32:26.073 回答
1

为了使@thebiglebowsy 的答案更加清晰,您可以使用:

必需-> 必需1/必需2/...

可选-> ?可选/?可选2/..

但是,我的建议是为每种可能性生成一条路线:

v1/api/test-api/:userId/

v1/api/test-api/:userId/:userName

v1/api/test-api/:userId/:userName/:userEmail

我在使用可选路线时遇到了几个问题

于 2015-03-23T07:20:31.677 回答
1

另一种方法是,您可以检查您是否在输入请求参数中收到了什么,并相应地进行验证或捕获值..

app.post('/v1/api/test-api', function(req, res) {
    var parameters = [];
    if(req.body.userName !== undefined) {
         //DO SOMEHTING
         parameters.push({username: req.body.userName});
    }
    if(req.body.userId !== undefined) {
        //DO SOMEHTING

       parameters.push({userId: req.body.userId});
   }
   if(req.body.userEmail !== undefined) {
      //DO SOMEHTING
      parameters.push({userEmail: req.body.userEmail});
   }

   res.json({receivedParameters: parameters});

});
于 2015-09-16T10:04:19.487 回答