【问题标题】:Pass parameters from router to controller in ExpressJS在 ExpressJS 中将参数从路由器传递到控制器
【发布时间】:2017-05-27 08:33:04
【问题描述】:

我有一条这样定义的路线

router.route('/:id/organisers').get(HackathonControllers.getHackathonRoles());

现在,getHackathonRoles 是一个控制器,例如:

function getHackathonRoles(role, req, res, next) {
    console.log(role);
    res.status(200).json({
        message: `Successfully updated Hackathon ${hackathonId}, published status updated to ${hackathonPublishedStatus}`
    })
}

我最理想的做法是通过定义多个路由器端点来传递一个角色。比如:

router.route('/:id/organisers').get(HackathonControllers.getHackathonRoles(role='organiser'));

和

router.route('/:id/volunteer').get(HackathonControllers.getHackathonRoles(role='volunteer'));

所以基本上我想重用getHackathonRoles 方法,并希望避免为不同的角色重写相同的方法。理想情况下,我应该能够在控制器中使用console.log(role)。

到目前为止,这失败了,我得到了错误:

router.route('/:id/organisers').get(_hackathonController2.default.getHackathonRoles(角色 = '组织者'));

如何解决这个问题并使其保持干燥?我不想将参数合并到/:id/? 等端点中,而参数类似于role=organiser 或role=volunteer 等。

【问题讨论】:

    标签: node.js express routing


    【解决方案1】:

    get 函数需要带有签名 (req, res, next) 的回调,因此您不能只传递任意参数并期望它工作。相反,您必须调用一个自己返回此类函数的函数。

    function getHackathonRoles(role) {
        console.log(role);
        return function(req, res, next) {
            // do something with the role variable
            // send a response using res.status(...).json(...)
        });
    }
    
    router.route('/:id/organisers').get(getHackathonRoles('organiser'));
    router.route('/:id/volunteer').get(getHackathonRoles('volunteer'));
    

    【讨论】:

    • 啊,这太聪明了。所以这是某种意义上的闭包?
    • @bholagabbar 完全正确。
    • 是的,完美运行。谢谢!很棒的解决方案。仍然无法克服你是怎么想出来的
    • @bholagabbar 好吧,在 JavaScript functions are first-class citizens 中,这种方法很常见:)
    • 是的,从 Java webapps 转换到在 NodeJS 中构建完整的服务是一个相当大的转变。仍然在学习! :)
    猜你喜欢
    • 1970-01-01
    • 2021-01-28
    • 2019-07-10
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 2013-08-15
    相关资源
    最近更新 更多