Я пытаюсь прочитать запрос из BigQuery и передать его во внешний интерфейс. В Node.js-land с Express это будет выглядеть так:
app.get('/endpoint', (req, res) => {
bigQuery.createQueryStream(query).pipe(res);
});
Однако createQueryStream()
не создает поток Node.js, вместо этого это пользовательский объект потока, который возвращает строк таблицы и, как таковой, происходит сбой:
(узел: 21236) UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_ARG_TYPE]: первый аргумент должен быть одним из типа string или Buffer. Полученный объект типа
Это подтверждается в официальной документации :
bigquery.createQueryStream(query)
.on('data', function(row) {
// row is a result from your query.
})
Итак, есть ли способ для потоковой передачи данных BigQuery во внешний интерфейс? Я подумал о двух возможных решениях, но хотел узнать, знает ли кто-нибудь лучший способ:
JSON.stringify()
строка и возврат JSONL
вместо простого JSON
. Это добавляет нагрузку на внешний интерфейс для его декодирования, но делает его довольно легким с обеих сторон. - Перейдите к REST API и выполните потоковую передачу с запросом , как:
request(url, { body: { query, params } }).pipe(res)
(или какой-то конкретный API, еще не копали там).
Я был смущен тем, что библиотека Node.js, которая говорит, что она выполняет потоковую передачу, не работает с Node.js собственные потоки, но, похоже, это так.