2016-05-31 5 views
1

У меня есть приложение, которое принимает запросы json. эти запросы json могут быть до 200k.express bodyParser блокирующий цикл событий

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 мса?

ответ

0

Нет, вы не можете предположить, что. Он занимает около 600 мс между вашими вызовами console, но только некоторые из них будут заняты body-parser, анализируя данные JSON (который будет блокировать цикл событий). Тем не менее, разбор 200K JSON - это не то, что займет много времени. На моем Mac для анализа 3MB JSON-файла требуется около 50 мс.

Я думаю, что большинство из этих 591ms фактически будет потрачено тело запроса (которое не блокирует).

+0

Спасибо, что ответили. Я просмотрел здесь https://github.com/expressjs/body-parser/blob/master/lib/types/json.js#L91 и будет ли это read(), где большинство из 591ms происходит в режиме блокировки без событий? –

+0

Да, это было бы моей догадкой. Вы можете редактировать файлы в './Node_modules/body-parser' вашего проекта, чтобы добавить дополнительные таймеры и посмотреть, действительно ли это правильно :-) – robertklep

+0

Это выглядит правильно. Любые мысли о том, почему для подобных запросов иногда требуется несколько мс и других, 500+ мс? В настоящее время я не вижу никаких других запросов. –

0

Нет, вы правы, считая, что разбор тела json занимает 591 мс, но он не обязательно блокировал цикл событий за такое количество времени. Среднее ПО в Express (и Connect под капотом) намеренно последовательное, но в большинстве случаев оно не должно блокировать цикл событий. Он может блокировать цикл обработки событий, в зависимости от того, как вы пишете, но время у вас есть просто мера того, сколько времени потребовалось каждому промежуточного программного обеспечения для вызова next()