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 毫秒中的大部分实际上会花在 读取 请求主体(非阻塞)上。