Невозможно сохранить «пользовательский блоб» в Firestore - ADMIN SDK - PullRequest
0 голосов
/ 22 мая 2019

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

Я пытаюсь сохранить каплю в пожарном депо, но получаю:

 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).

Вот как я конвертирую свой пользовательский BLOB-объект в BLOB-объект 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 работает хорошо, и я возвращаю большой объект, который в порядке.

Что я делаю не так?

1 Ответ

1 голос
/ 22 мая 2019

Модуль "Firebase" не является частью SDK администратора, это SDK клиента. Вы не можете смешивать использование этого с firebase-admin. Придерживайтесь только символов и API, предоставляемых firebase-admin, если вы собираетесь передавать их в качестве параметров в методы firebase-admin SDK. Вероятно, вам следует полностью удалить модуль «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 .

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...