【问题标题】:Node/express, optional parameters switch route between get and postnode/express,可选参数在get和post之间切换路由
【发布时间】:2016-10-29 17:53:04
【问题描述】:

我为我的快递服务器设置了 2 条路线,它们看起来非常接近。它们基本上是相同的 url,除了一个是 post 一个是 get,并且 get 有一个额外的路由参数(这是可选的)。现在这些似乎工作正常,但是如果我不将可选参数添加到 get 调用中,它认为我正在尝试发布帖子。我希望能够在不传递第二个可选参数的情况下进行 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 上做一个 get 并且不添加 /:navigationType 变量,它认为我正在尝试使用 post 方法。我对这个工作很陌生,希望能提供任何帮助或见解。谢谢!

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    当你声明一个路由时,比如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']));
    

    【讨论】:

    • 感谢您的回复,但这似乎并不能解决问题。
    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 2017-05-02
    • 2017-08-29
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多