Я использую 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"