Чтение из firebase / google cloud storage в качестве буфера в функции node.js

Я использую Node.js 8 версию функций Firebase и хочу получить файл из облачного хранилища Google для функции как Buffer.

Это кажется простым:

const admin = require('firebase-admin')
const getRawBody = require('raw-body')

async function myFunction (path) {
  const bucket = admin.storage().bucket()
  const file = await bucket.file(path).get()
  console.log("All good so far.")
  const buffer = await getRawBody(file.createReadStream()) // often fails.
}

Файл, который я читаю, банально мал (130 КБ).

Этот делал работает некоторое время, но теперь постоянно дает сбой либо с ошибкой ограничения памяти, либо с ошибкой тайм-аута, что указывает на проблему Firebase / GCS.

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

Есть ли лучший способ преобразовать файл GCS в Buffer?

Если нет, то можно ли обойти эту проблему?

Я думаю, что с const buffer = getRawBody(file.createReadStream()) вы смешиваете асинхронные и синхронизирующие функции. так что это должен быть const buffer = await getRawBody(file.createReadStream()), потому что raw-body возвращает обещание.

lependu 31.10.2018 13:10

Спасибо @lependu; это правильно. Первоначально я написал пример для возврата вызова; починю. Конечно, это упущение может привести к короткому замыканию, поэтому не решает проблему.

Brian M. Hunt 31.10.2018 15:43
8
2
1 901
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема была не в хранилище Google, а в том, что использование данных в другом месте вызвало переполнение памяти.

В результате операторы console.log не записывались в журнал функций, объединяя причину.

Сработало у меня, когда я удалил get() из const file = await bucket.file(path).get()

Мой рабочий код:

const admin = require('firebase-admin')
const getRawBody = require('raw-body')

async function getStream (path) {
    const bucket = admin.storage().bucket()
    const file = await bucket.file(path)
    const buffer = await getRawBody(file.createReadStream()) 
}

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