Трубопровод 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?

Я думаю, что вам нужно сохранить отправку данных без хранения всего файла в памяти.

Поэтому вам нужно использовать трубу. Труба позволит вам отправлять данные с кусками

Другие вопросы по тегам