Node.js Express postgres поток данных в ответ - PullRequest
0 голосов
/ 08 апреля 2020

Я использую Node.js Express с postgres дБ для отображения некоторых данных, и я построил API, который дает мне данные в формате CSV. Для достижения оптимального решения я использую потоки. Поэтому я просто использовал pg.Pool , pg-query-stream и в основном использую код, показанный в качестве примера:

    pg.connect((err, client, done) => {
          if (err) throw err;
          const query = new QueryStream('SELECT * FROM table')
          const stream = client.query(query)
          //release the client when the stream is finished
          stream.on('end', done)
          stream.pipe(JSONStream.stringify()).pipe(res)
    })

Только разница между этим и примером заключается в том, что я передаю ответ вместо process.stdout.

Это решение работало нормально, но я заметил, что иногда клиент не возвращается в пул и навсегда зависает в базе данных. Я провел некоторое тестирование и обнаружил, что когда я создаю несколько запросов к API (обновляя страницу F5, ...), поток ответов (каким-то образом) разрушается до client.query stream заканчивает запись и поэтому stream.on ('end', done) никогда не происходит. На данный момент мое решение состоит в том, что я освобождаю клиента не тогда, когда поток записи завершен, а когда поток ответов закрывается, как показано ниже.

    pg.connect((err, client, done) => {
          if (err) throw err;

          //***NEW CODE***
          res.on('close', function() {
              stream.destroy();
              done();
          });

          const query = new QueryStream('SELECT * FROM table')
          const stream = client.query(query)
          //release the client when the stream is finished
          //stream.on('end', done)
          stream.pipe(JSONStream.stringify()).pipe(res)
    })

Все, что я хотел знать, является ли это стандартным решением для стандартной проблемы, или это не хорошая и потенциально опасная практика.

Спасибо за ваши комментарии.

step

Версии:

"node": "12.16.1" "pg": "^ 8.0.0", "pg-pool": "^ 3.0.0", "pg-query-stream": "^ 3.0.4", "express": "~ 4.16.0"

...