节点/快速,可选参数在get和post

时间:2016-06-27 16:12:26

标签: node.js express

我为我的快速服务器设置了2条路线,它们看起来非常接近。它们基本上是相同的url,除了一个是post而另一个是get,并且get有一个额外的路由param(这是可选的)。现在这些似乎工作正常,但是如果我不在get调用中添加可选参数,它会认为我正试图点击帖子。我希望能够在没有传递第二个可选参数的情况下点击获取调用。让我告诉你到目前为止我所拥有的:

router.param('itemID', (req, res, next, itemID) => {
    verbose("itemID=", itemID);
    next();
});

router.param('navigationType', (req, res, next, navigationType) => {
    if (!navigationType) {
        next();
    }
    verbose("navigationType=", navigationType);
    next();
}); 

router.route('/:itemID/navigations')
    .post(controllers.addActivity)
    .all(routes.send405.bind(null, ['POST']));

router.route('/:itemID/navigations/:navigationType')
    .get(controllers.listActivities)
    .all(routes.send405.bind(null, ['GET']));

routed.send405方法如下所示:

function send405(methods, req, res) {
    res.set('Allow', methods.join(','));
    res.status(405).json({
        message: `Method '${req.method}' Not Allowed.`
    });
}

所以现在问题是如果我开始使用/blah123/navigations并且不添加/:navigationType变量,它会认为我正在尝试使用post方法。我很擅长与此合作,并希望得到任何帮助或见解。谢谢!

1 个答案:

答案 0 :(得分:0)

当您声明路线时,请说GET /admins/:id,它会匹配对GET /admins/1GET /admins/john的所有请求。但是当你只做GET /admins时,它将无法找到,因为你没有声明GET路由匹配该模式。

要使用此功能,您必须指定navigationType是一个可选参数,并且首先放置GET请求,然后是POST,就像这样。

router.route('/:itemID/navigations/:navigationType?')
    .get(controllers.listActivities)
    .all(routes.send405.bind(null, ['GET'])); 

router.route('/:itemID/navigations')
    .post(controllers.addActivity)
    .all(routes.send405.bind(null, ['POST']));