Трубопровод oboe.js проанализировал json для объекта ответа http в Node.js
Я использую Oboe.js для синтаксического анализа JSON из узла readStream и хочу отправить его обратно клиенту, запрашивающему его с эффективным использованием памяти. Можно ли передавать данные из гобоя node
или же path
события в объект HTTP-ответа Node.js, так что я могу доставить проанализированные данные на лету клиенту, а не собирать их полностью и отправлять все сразу? Это код, который я до сих пор:
const express = require('express');
const app = express();
const PORT = 3000;
const oboe = require('oboe');
const fs = require('fs');
app.get('/download', (req, res) => {
const jsonDataStream = fs.createReadStream('./citylots.json');
oboe(jsonDataStream)
.node('features.*', function(feature) {
// res.send is non-streaming. how to stream?
res.send(feature);
});
});
app.listen(PORT, () => console.log(`up on port ${ PORT }!`));
2 ответа
По вашему конкретному вопросу, я думаю, что проблема связана с тем, что res.send
завершает ответ ( документы). При условии res
это записываемый поток, вы можете позвонить res.write
написать строку в ответ. Вам нужно будет проделать дополнительную работу, чтобы вставить запятые, а также начальный [
а также ]
,
const express = require('express');
const app = express();
const PORT = 3000;
const oboe = require('oboe');
const fs = require('fs');
app.get('/download', (req, res) => {
const jsonDataStream = fs.createReadStream('./citylots.json');
oboe(jsonDataStream)
.node('features.*', function(feature) {
res.write(JSON.stringify(feature));
});
});
app.listen(PORT, () => console.log(`up on port ${ PORT }!`));
Чтобы отступить от этого, я хочу быть уверенным, что Гобой хорош для вашего случая использования. Это может усложнить вашу реализацию без особой выгоды. Ваша цель - уменьшить объем памяти, отправляя меньше данных клиенту? Другими словами, вы пытаетесь избежать отправки всех citylots.json
и вместо этого хочу только отправить его features
?
Я думаю, что вам нужно сохранить отправку данных без хранения всего файла в памяти.
Поэтому вам нужно использовать трубу. Труба позволит вам отправлять данные с кусками