进行异步调用的 Express 中间件

nik*_*ohn 1 analytics middleware node.js express snowplow

我们有一个 NodeJS Express 应用程序,我们已经为其实现了自定义分析后端。现在,我们正在决定如何为功能手机等禁用 JS 的浏览器实现跟踪机制。

我们正在考虑的一种设计方法是创建一个中间件,它拦截每个请求,从请求/上下文中提取参数并将它们发送到后端。这是非常可扩展的,对于像我们这样的自定义分析解决方案非常有意义。

另一种方法是像谷歌分析一样创建一个跟踪像素,然后从中提取数据。但对于自定义跟踪解决方案来说,这似乎是一个可扩展性较差的解决方案,因为与 GA 不同,参数和数据结构可以随时更改或扩展。

我的问题是 - 制作发出异步请求的中间件是否有任何反面?在创建它时我们需要注意什么,因为对我们服务器的每个请求都将通过这个中间件?我们是一个相当大的应用程序,每分钟有数十万的流量。

小智 5

只要您保持中间件异步并next()在必要时调用该方法,就应该没问题。Express 可以处理相当多的负载,前提是您的服务器实例已为其配置。

真正的问题是当您开始执行同步方法时,您可以/应该利用承诺来正确处理它们的解决方案。

PROTIP:在中间件/控制器逻辑中尽可能避免嵌套的 promise 解析。使用类似 Bluebird 的.all()方法,这样您就不会在阻塞请求上浪费处理时间,如果您必须发出顺序回调,请考虑异步瀑布或异步系列(取决于您选择的承诺库),这将允许您按顺序运行您的承诺决议,如果他们依赖于先前的信息。有助于保持你的代码干净。