Не удается сохранить «пользовательский большой двоичный объект» в Firestore — ADMIN SDK

В ответ на старый вопрос я сделал здесь, теперь у меня такая же проблема с SDK администратора, но я не могу ее решить.

Я пытаюсь сохранить BLOB-объект в firestore, но получаю:

 Error: Value for argument "data" is not a valid Firestore document. Couldn't serialize object of type "Blob" (found in field data). Firestore doesn't support JavaScript objects with custom prototypes (i.e. objects that were created via the "new" operator).

Вот как я конвертирую свой собственный большой двоичный объект в большой двоичный объект Firestore:

// The import
import {firestore} from "firebase";

// The function 
export const parseQueue = functions.region('europe-west2').pubsub.schedule('every 1 minutes').onRun(async (context) => {

....code...

// The problem
writePromises.push(
          admin.firestore()
            .collection('users')
            .doc(userID)
            .collection('events')
            .doc(<string>event.getID())
            .collection('activities')
            .doc(<string>activity.getID())
            .collection('streams')
            .doc(stream.type)
            .set({
              type: stream.type,
              data: firestore.Blob.fromBase64String(new Buffer((Pako.gzip(JSON.stringify(stream.data), {to: 'string'})), 'binary').toString('base64')),
            }))

Вышеприведенный сбой, когда я вызываю set с ошибкой, упомянутой ранее.

Функция firestore.Blob.fromBase64String работает хорошо, и я получаю нормальное пятно.

Что я делаю неправильно?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
2
0
814
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Модуль «firebase» не является частью Admin SDK, это клиентский SDK. Вы не можете смешивать это с firebase-admin. Придерживайтесь только символов и API, предоставленных firebase-admin, если вы собираетесь передавать их в качестве параметров методам SDK firebase-admin. Вероятно, вам следует полностью удалить модуль «firebase» из вашего проекта.

Вы не показали это, но я предполагаю, что вы уже импортировали firebase-admin, как один из этих:

import * as admin from 'firebase-admin'
const admin = require('firebase-admin')

Теперь каждый раз, когда вы хотите использовать API-интерфейсы Firestore, вы обычно проходите через предоставленный им объект firestore:

const firestore = admin.firestore

Вы уже делаете это однажды со своим призывом к admin.firestore().collection().... Это в основном реэкспорт всего из Cloud Firestore SDK для nodejs.

Объект капля, который вы используете с клиентским SDK, не предоставляется серверным SDK. Если вы хотите написать массив байтов, вам придется напрямую использовать объект узла Буфер.

doc.set({
    type: stream.type,
    data: new Buffer((Pako.gzip(JSON.stringify(stream.data), {to: 'string'})), 'binary')
})

Или что вам нужно сделать, чтобы сделать правильный буфер.

Я думаю, что эта капля была/была проблемой. Сейчас смотрю, спасибо уже

Jimmy Kane 22.05.2019 17:38

Барабанная дробь! Спасибо!

Jimmy Kane 22.05.2019 17:45

Одна вещь, которую я замечаю: буфер не принимается на стороне клиента и нуждается в firestore.blob. Кроме того, методы firestore.blob vs buffer создают двоичные файлы разного размера.

Jimmy Kane 22.05.2019 18:07

Да, клиентский и серверный код будут отличаться.

Doug Stevenson 22.05.2019 18:11

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