9

使用 Express js 编写一个简单的 NodeJS 网络服务。从历史上看,我是一个蟒蛇人。

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

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

我正在开发一个 Express 中间件,并且一切都与app.use3-parity 函数配合良好,但这仅与每个请求的逻辑执行有关。我想允许插件的最终用户仅在类似于上面源代码中概述的模式的特定端点上运行我的逻辑包(已经在单独的函数中)。

这些包装器的一些配置将在应用程序启动时传递。

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

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

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

1 回答 1

11

以下是表达惯用的策略:

  1. 与整个站点的大多数请求相关的东西变成了正常的连接中间件:app.use(express.cookieParser())
  2. 仅与特定路线相关的事物可以仅在该路线上进行:app.post('/users', express.bodyParser(), createUser). 这是我认为最符合您上述情况的模式
  3. 相关中间件组可以作为列表传递:app.get('/books', [paginate, queryLimit, memoize], getBooks). 当然,该列表可以是变量或模块,因此以 DRY 方式共享。
  4. 由路径本身中的模式触发的常见功能可以使用app.paramapp.get('/:username/hobbies', getHobbies)
  5. 现有的常规函数​​可以包装到中间件中,以使其适应中间件 API。
  6. 您可以正常调用函数。并非每种代码重用方法都必须硬塞到 express 的一种方便模式中。

为了更直接地解决您的问题,我认为您不应该尝试将 python 装饰器模式 1 对 1 移植到 javascript。中间件基本上完成了同样的事情。如果您使用装饰器发布具体示例,我们可以建议一种惯用的方式在 express 中实现它们。

于 2013-11-06T16:08:32.443 回答