Node.js&使用参数快速路由

时间:2016-01-31 21:25:13

标签: javascript node.js api express routes

我目前在node.js中有2条路由用于我正在构建的API。他们是:

app.get('/api/v1/user/:userid', function (req, res) {
    return res.status(200).json(GetUser());
});

app.get('/api/v1/user', function (req, res) {
    return res.status(400).json('UserId expected');
});

如您所见,两条路线实际上应合并为一条,例如:

app.get('/api/v1/user/:userid', function (req, res) {
    console.log('this should still show if :userid is not populated, but it does not');

    if(!req.params.userid)
        return res.status(400).json('UserId expected');

    return res.status(200).json(GetUser());
});

但是,当我在没有指定:userid的情况下使用Postman测试上述端点时,我将得到超时。显然,如果我提供:userid,我会得到相应的用户。

此外,我发现在console.log未指定时,:userid将永远不会显示在终端中。这是我的终端输出:

this should still show if :userid is not populated, but it does not
GET /api/v1/user/56a6861675774c1a046bf780 200 3.140 ms - 274
GET /api/v1/user/ - - ms - -

所以上述所有因素都让我相信,因为:useridundefinednull,它正在破坏快速中间件。这个假设是否正确,我该如何克服它?

1 个答案:

答案 0 :(得分:2)

假设是正确的。为/api/v1/user/:user_id定义的处理程序不能用于/api/v1/user。因此,路由/api/v1/user/将无法处理'GET'请求。

您需要为不同的路线定义不同的处理程序。

解决方案是使用Express router中间件来定义您的路线。

var router = express.Router();
router.route('/api/v1/user')
  .get(); // define handler for multiple resources here.

router.route('/api/v1/user/:user_id')
  .get(); // define handler for single resource here.

app.use('/', router);