Express JS相当于Python框架中的decorator模式

时间:2013-11-06 15:27:37

标签: node.js express decorator

使用Express js编写一个简单的NodeJS Web服务。我以前是个蟒蛇人。

在像Django或Flask这样的框架中,通常看到Python装饰器只用于在特定端点上实现插件的逻辑。这里可以看到这种模式的一个例子。

http://pythonhosted.org/Flask-Classy/#using-multiple-routes-for-a-single-view

我正在研究Express中间件,并且使用app.use 3奇偶校验函数使一切运行良好,但这仅适用于每个请求的逻辑执行。我想允许插件的最终用户仅在特定端点上运行我的逻辑包(已经在单独的函数中),类似于上面源中概述的模式。

这些包装器的一些配置将在app start处传递。

最好的方法是什么?我应该使用将实际路由处理程序作为参数并在结束时返回的函数来模拟此模式吗?像这样的东西?

function pluginWrapper(endptFunc){
    //plugin logic here
    return endptFunc;
  }

  app.get('/endpt', pluginWrapper(function(req,res,next){
    //endpt logic here
    res.end()
  }));

1 个答案:

答案 0 :(得分:11)

以下是明确的惯用策略:

  1. 整个网站上大多数请求的相关内容都成为正常的连接中间件:app.use(express.cookieParser())
  2. 仅针对特定路线的相关事件可以仅在该路线上进行:app.post('/users', express.bodyParser(), createUser)。这是我认为最符合上述情况的模式
  3. 相关中间件组可以作为列表传递:app.get('/books', [paginate, queryLimit, memoize], getBooks)。当然,该列表可以是变量或模块,因此以干燥的方式共享。
  4. 路径中的模式触发的常用功能可以使用app.paramapp.get('/:username/hobbies', getHobbies)
  5. 现有的常规函数​​可以包装到中间件中,以使它们适应中间件API。
  6. 您可以正常调用函数。并不是每种代码重用方法都必须用于快速方便的模式之一。
  7. 为了更直接地解决您的问题,我认为您不应该尝试将python decorator模式1对1移植到javascript。中间件基本上完成了同样的事情。如果你使用装饰器发布具体的例子,我们可以建议一种惯用的方式来实现它们。