express bodyParser 阻塞事件循环
express bodyParser blocking event loop
我有一个接受 json 请求的应用程序。这些 json 请求最多可达 200k。
app.use(function (req, res, next) {
console.time("start2")
next();
});
app.use(bodyParser.json({ limit: '5mb' }));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cors());
app.enable('trust proxy');
app.use(function (req, res, next) {
console.timeEnd("start2")
next();
});
控制台打印的内容是
start2: 591ms
我假设解析请求的 json 主体将事件循环阻塞了 591 毫秒是否正确?
不,您假设解析 json 正文花费了 591 毫秒是正确的,但它不一定会在这段时间内阻塞事件循环。 Express 中的中间件(以及幕后的 Connect)是有意顺序的,但在大多数情况下它不应该阻塞事件循环。它可以阻塞事件循环,这取决于你如何编写它,但你拥有的时间只是衡量每个中间件调用多长时间的度量next()
不,你不能这么想。在您的 console
调用之间大约需要 600 毫秒,但只有一部分会被 body-parser
解析 JSON 数据( 将 阻止事件循环)。不过,解析 JSON 的 200K 并不需要那么多时间。在我的 Mac 上,解析一个 3MB JSON 文件大约需要 50 毫秒。
我认为这 591 毫秒中的大部分实际上会花在 读取 请求主体(非阻塞)上。
我有一个接受 json 请求的应用程序。这些 json 请求最多可达 200k。
app.use(function (req, res, next) {
console.time("start2")
next();
});
app.use(bodyParser.json({ limit: '5mb' }));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cors());
app.enable('trust proxy');
app.use(function (req, res, next) {
console.timeEnd("start2")
next();
});
控制台打印的内容是
start2: 591ms
我假设解析请求的 json 主体将事件循环阻塞了 591 毫秒是否正确?
不,您假设解析 json 正文花费了 591 毫秒是正确的,但它不一定会在这段时间内阻塞事件循环。 Express 中的中间件(以及幕后的 Connect)是有意顺序的,但在大多数情况下它不应该阻塞事件循环。它可以阻塞事件循环,这取决于你如何编写它,但你拥有的时间只是衡量每个中间件调用多长时间的度量next()
不,你不能这么想。在您的 console
调用之间大约需要 600 毫秒,但只有一部分会被 body-parser
解析 JSON 数据( 将 阻止事件循环)。不过,解析 JSON 的 200K 并不需要那么多时间。在我的 Mac 上,解析一个 3MB JSON 文件大约需要 50 毫秒。
我认为这 591 毫秒中的大部分实际上会花在 读取 请求主体(非阻塞)上。