以异步方式执行 Express res.render

Posted

技术标签:

【中文标题】以异步方式执行 Express res.render【英文标题】:Executing Express res.render in a async manner 【发布时间】:2013-09-29 10:56:27 【问题描述】:

我有一个 nodejs 应用程序,其中res.render 的 express 方法以阻塞方式花费了大约 400 毫秒。我如何处理这个以非阻塞方式执行?我的 apache 基准测试需要 12 秒来执行大约 30 个并发请求。如何以更好的方式实现这一点?

var start = +new Date;
//fetch data from redis
console.log('time taken to fetch data from redis ' + (+new Date - start)); //30 ms
res.render('some_jade_view', params);
console.log('time taken to render data ' + (+new Date - start)); //530 ms

我尝试了process.nextTick,但没有太大帮助,ab 结果是一样的。

【问题讨论】:

给我们看一些代码。尤其是带有 .render 调用的部分。 @Krasimir 添加了代码,但这并没有多大帮助,因为玉视图需要 500 毫秒的时间来渲染。现在,我注意到它本质上是阻塞的。 res 是传递给快速路由的响应对象。 玉观是不是极其复杂?您是否添加了任何可能会延迟渲染的中间件? @WiredPrairie 没那么复杂,它只是创建了大约 200 KB 的 html ;) 好吧,问题仍然是使 res.render 非阻塞,这样即使它很复杂,它适用于 30 个同时连接。 也许这个:***.com/questions/16280917/…。没有什么开关可以进行需要顺序异步渲染的长时间阻塞调用。 【参考方案1】:

我认为你真的应该看看https://github.com/caolan/async。

直接来自 Async 的仓库:

Async 是一个实用模块,它提供了直接、强大的 用于处理异步 javascript 的函数。 (...)

Async 提供了大约 20 个函数,其中包括通常的“函数式” 嫌疑人(map、reduce、filter、each…)以及一些常见的模式 用于异步控制流(并行、串行、瀑布......)。全部 这些函数假定您遵循提供的 node.js 约定 单个回调作为异步函数的最后一个参数。

干杯。

编辑:我不确定以异步方式呈现您的视图是否真的可以帮助您减少时间。您可能希望在客户端实现一个流,以便在数据出现时获取和模板化数据。为此,您可以使用像 Angular 这样的前端框架,或者手动进行。

【讨论】:

以上是关于以异步方式执行 Express res.render的主要内容,如果未能解决你的问题,请参考以下文章

koa2、koa1、express比较

Express接口案例 使用jsonwebtoken

以同步方式执行异步调用

NodeJS Express 异步/等待

如果javascript“异步”函数的主体中没有“等待”,它会以任何不同的方式执行吗? [复制]

在express中的每个数组元素中进行猫鼬查询时如何处理异步?