使用参数的Node.js&Express路由

我目前在node.js中有2条路由,用于我正在构build的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()); }); 

但是,当我用邮递员testing上述端点没有:userid指定,我会得到一个超时。 显然,如果我提供:userid ,我得到相应的用户。

另外我发现console.log将永远不会显示在terminal中:userid没有被指定。 这是我的terminal输出:

 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 - - 

所以上面的所有信息都让我相信,因为:useridundefined或者是null ,所以它打破了快速的中间件。 这个假设是否正确,我该如何克服?

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

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

一个解决scheme是使用Express路由器中间件来定义你的路由。

 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);