【问题标题】:Express JS equivalent of decorator pattern from Python frameworksExpress JS 等效于 Python 框架中的装饰器模式
【发布时间】:2013-11-17 22:10:02
【问题描述】:

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

在 Django 或 Flask 等框架中,通常会看到 Python 装饰器用于仅在特定端点上实现来自插件的逻辑。可以在此处查看此模式的示例。

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

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

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

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

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

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

【问题讨论】:

    标签: node.js express decorator


    【解决方案1】:

    这里是表达的惯用策略:

    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 中实现它们。

    【讨论】:

    • 非常感谢!是的,我有一种感觉,总体上近似装饰器是一个坏主意。只是在寻找使用更高阶函数的正确方法。 #2 和 #3 看起来正是我想要的!
    猜你喜欢
    • 1970-01-01
    • 2016-08-10
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多