我有一个接受 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()
所花费的时间