Дополнительный код + информация по адресу: https://github.com/expressjs/express/issues/3817
У меня есть система, которая анализирует некоторые данные из файлов, а затем отправляет их в Express API через POST.
Размерданные меньше 1 МБ.
Я посылаю около 7 запросов в секунду (7 файлов в секунду) на мой API, вот код API:
api.post('/data', async (req, res) => {
let data = req.body.data;
if (data) {
log.info('Saving data : ' + data.filePath);
let newData = await saveData(data);
log.info('Finished saving data : ' + data.filePath);
res.status(201).json(newData._id);
}
else
res.status(400).end();
});
Функция saveData:
async function saveData(d) {
let x = await OtherData.findOneAndUpdate(...);
//some processing...
return Data.findByIdAndUpdate(d._id, d, {new: true, upsert: true});
}
Если я проверяю выходные данные API с журналами, это довольно мгновенно, я вижу обе строки одну за другой.Кроме того, как только я перестаю отправлять данные, я перестаю видеть вывод логов, поэтому нет ни задержки, ни стека запросов, он определенно может обрабатывать 7 запросов / с (я думаю).
Я пробовал с chromeотладчик, вот что я получаю:
Размер продолжает расти довольно быстро, до достижения максимума и затем выключая сервер.Кроме того, после того, как я прекращаю отправлять данные, сразу после этого не освобождается память, мне нужно подождать несколько минут.
Если у вас есть идеи о том, что случилось, или какие-либо советы о том, как отследить это более эффективноЭто будет здорово.
Спасибо
Обновление:
- Узел v10.14
- Mongo v4.0.4
- Mongoosev5.3.13
- Express v4.16.4
Редактировать
Я урезал функцию saveData
и поместил все в строку внутри api.post
функция, все еще есть та же проблема.
Теперь код выглядит так:
api.post('/data', async (req, res) => {
let data = req.body.data;
if (data) {
log.info('Saving data : ' + data.filePath);
let x = await OtherData.findOneAndUpdate(...);
//some processing...
let newData = await Data.findByIdAndUpdate(data._id, data, {new: true, upsert: true});
log.info('Finished saving data : ' + data.filePath);
res.status(201).json(newData._id);
}
else
res.status(400).end();
});
Обновление 2
Я полностью удалилсвязанный с mongoose код - я буквально просто получаю данные и возвращаю строку «получены», но память все равно увеличивается.
Может быть связано с: https://github.com/expressjs/express/issues/3413