Я создаю сервер NodeJS с ExpressJS, который обрабатывает данные ( 50 КБ до > 100 МБ ), отправленные с помощью POST-запроса из приложения для настольного компьютера, подлежащего обработке и вернулся. Настольное приложение gzip сжимает данные перед отправкой (50 КБ становится 4 КБ).
Я хочу, чтобы сервер распаковывал данные, извлекал значения из данных (строки, целые числа, символы, массивы, json и т. Д.), Обрабатывал эти данные и затем отвечал обработанными данными.
Я начал с этого:
apiRoute.route("/convert").post(bodyParser.raw({limit: '100Mb'}), (req, res) =>{
let outputData;
//extract values from req.body Buffer and do math on them.
//save processed data in outputData
res.json({
status: true,
data: outputData
});
});
Это работает, потому что body-parser распаковывает данные в буфер req.body
, хранящийся в памяти. Это моя главная проблема ... использование памяти. Я не хочу хранить весь набор данных в памяти.
Чтобы решить эту проблему, я удалил body-parser и вместо этого направил поток запросов непосредственно в поток преобразования zlib:
apiRoute.route("/convert").post((req, res) =>{
req.pipe(zlib.createGunzip());
});
Проблема в том, что я не знаю, как извлечь двоичные значения из потока.
Вот что я бы хотел сделать:
apiRoute.route("/convert").post((req, res) =>{
let binaryStream = new stream.Transform();
req
.pipe(zlib.createGunzip())
.pipe(binaryStream);
let aValue = binaryStream.getBytes(20);//returns 20 bytes
let bValue = binaryStream.getBytes(20000);//returns the next 20000 bytes
//etc...
});
Однако я не знаю, как это сделать. Модули, такие как Dissolve , близки, однако они требуют, чтобы вы заранее настроили логику синтаксического анализа, а all захваченных значений сохраняются в памяти.
Кроме того, я не знаю, как реагировать с помощью outputData, не загружая все это в память.
Итак, мой вопрос, как мне ...
- Асинхронно считывать данные из потока с моей собственной скоростью и извлекать значения в
- Отправлять обработанные данные обратно в настольное приложение, не помещая их в память