表达式正文解析器阻塞事件循环



我有一个接受 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 毫秒是否正确?

不,你不能假设。console调用之间大约需要 600 毫秒,但只有一部分会被body-parser解析 JSON 数据占用(这将阻止事件循环)。尽管如此,解析 200K 的 JSON 并不需要花费那么多时间。在我的 Mac 上,解析一个 3MB 的 JSON 文件大约需要 50 毫秒。

我认为这 591ms 中的大部分实际上将用于读取请求正文(这是非阻塞的)。

不,假设解析 json 主体花费了 591 毫秒,但这不一定会在这段时间内阻塞事件循环,这是正确的。 Express 中的中间件(和引擎盖下的连接)是有意顺序的,但在大多数情况下它不应该阻塞事件循环。 它可以阻塞事件循环,具体取决于您如何编写它,但您拥有的时间只是衡量每个中间件调用next()所花费的时间

最新更新