在ExpressJS中将参数从路由器传递到控制器

时间:2017-05-27 08:33:04

标签: node.js express routing

我有一条定义为

的路线

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 /组织者')。得到(_hackathonController2.default.getHackathonRoles(角色   ='组织者'));

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

1 个答案:

答案 0 :(得分:4)

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