0

思考正确的方法,如何在 node.js Web 项目中使用中间件,使用目前正在成长的 express 和 connect。

当然,现在有中间件必须在全球范围内传递或扩展请求,但在很多情况下,有一些特殊的工作,比如准备传入数据,在这种情况下,中间件只能用于一组 http 方法和路由。

我有一个基于组件的架构,每个组件都有自己的中间件层,可以实现该组件可以处理的请求。在应用程序启动时,任何必需的组件都会被加载并准备好。将中间件代码执行绑定到 URL 以降低 CPU 负载是一个好主意,还是仅将中间件用于全局目的更好?

这是一些与 url 相关的中间件的外观。

app.use(function(req, res, next) {            

        // Check if requested route is a part of the current component
        // or if the middleware should be passed on any request
        if (APP.controller.groups.Component.isExpectedRoute(req) ||
            APP.controller.groups.Component.getConfig().MIDDLEWARE_PASS_ALL === true) {
                // Execute the midleware code here
                console.log('This is a route which should be afected by middleware');
                ...
                next();                    
            }else{
                next();
            }
        });
4

2 回答 2

1

这取决于您的设置,但您可以发挥创造力。

假设您想为GET带有/foo前缀的请求运行某个中间件。在这种情况下,您可以使用以下方式限制对该中间件的调用次数:

// matches '/foo', '/foo/bar', '/foo/bar/blah', ...
app.get('/foo*', YourMiddleware);

(替换app.get为通过中间件等app.all传递所有请求方法)

如果您只想运行有限数量(一个或两个)特定路由的中间件,您可以在路由声明中注入它:

app.get('/bar', YourMiddleware, function(req, res) {
  ...
});

如果您有特定的中间件集,则可以创建它们的数组,您可以类似地使用它们:

var MiddlewareSet = [ MiddlewareA, MiddlewareB, MiddlewareC ];
...
app.get('/', MiddlewareSet, function(req, res) {
  ...
});
于 2013-10-26T19:15:36.323 回答
0

这就像概率。让我们假设,有 10 个 url,您的中间件将执行 7 或 8 个 url。那么更好的主意是,使用您的全局中间件或以其他方式将它们用作正常功能。

当然,你可以做任何一种方式。希望没有大的性能变化,因为你必须考虑一些原因,

  1. 与 PHP 不同,Node.Js 应用程序在应用程序启动时读取所有代码并将它们存储在内存中。所以没有运行时包含的代码。

  2. 您必须通过使用某些功能(中间件功能)来停止块执行的任何方式。该函数可以进行实际操作或检查url是否有资格执行实际操作(如您帖子中的代码)

注意:无论是什么,您的代码都应该是可读且有意义的,并且旨在完成操作

注意***:更重要的是,您无法避免 cpu 加载“Javascript/Node.JS”。但是,您可以通过尽可能将所有变量保留在本地范围内来管理它。因此,内置的垃圾收集器可以有效地为您做同样的事情。

于 2013-10-26T18:52:35.560 回答