如何在快递中装饰app方法?

时间:2015-04-30 11:25:47

标签: javascript node.js express decorator

我使用node.js并表达v4.12。我想通过自定义逻辑来装饰所有app.get次调用。

app.get(/*getPath*/, function (req, res, next) {
    // regular logic
});

和我的自定义逻辑

customFunc() {
 if (getPath === 'somePath' && req.headers.authorization === 'encoded user'){
       //costum logic goes here
       next();
    } else {
       res.sendStatus(403);
    }     
}

我的想法是在我已经拥有的代码之前执行自定义逻辑,但我需要访问自定义函数中的reqresnext个对象。还有一个问题,我需要app.get参数来处理custumFunc中的请求模式。 我试着像这样实现装饰模式:

var testfunc = function() {
    console.log('decorated!');
};

var decorator = function(f, app_get) {
    f();
    return app_get.apply(this, arguments);
};
app.get = decorator(testfunc, app.get);

但是javascript会抛出错误。

修改 如果app.use()我只能得到/users/22之类的req.path,但是当我像app.get('/users/:id', acl, cb)那样使用它时,我可以获得req.route.path属性,它等于'/users/:id'是我的ACL装饰我需要的。但是我不想为每个端点调用acl函数,并尝试将其移动到app.use()但是req.route.path属性。

2 个答案:

答案 0 :(得分:2)

您正在尝试构建middleware。只需通过app.use将您的装饰器添加到应用程序中。

答案 1 :(得分:2)

实施middleware的示例:

app.use(function(req, res, next) {
 if (req.path==='somePath' && req.headers.authorization ==='encoded user'){
       //costum logic goes here
       next();
    } else {
       res.sendStatus(403);
    }  
});

如果您只想在一个路径中传递中间件,可以这样实现:

app.get(/*getPath*/, customFunc, function (req, res, next) {
    // regular logic
});