无法将“自定义Blob”保存到Firestore-ADMIN SDK

时间:2019-05-22 14:27:26

标签: javascript node.js firebase google-cloud-firestore blob

在我回答here之前,我遇到了一个较旧的问题,现在我在管理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).

这是我将自定义Blob转换为Firestore Blob的方法:

// 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运作良好,我确实得到了一个不错的blob。

我在做什么错?

1 个答案:

答案 0 :(得分:1)

“ firebase”模块不是Admin SDK的一部分,而是客户端SDK。您不能将其用法与firebase-admin混合使用。如果要将符号和API作为参数传递给firebase-admin SDK方法,请仅遵循firebase-admin提供的符号和API。您可能应该从项目中完全删除模块“ firebase”。

您没有显示它,但是我假设您已经像以下其中一种一样导入了firebase-admin:

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

现在,任何时候您想要使用Firestore API时,通常都需要遍历其提供的firestore对象:

const firestore = admin.firestore

调用admin.firestore().collection()...已经完成一次。基本上是从Cloud Firestore SDK for nodejs重新导出所有内容。

服务器SDK未提供您与客户端SDK一起使用的Blob对象。如果要编写字节数组,则必须直接使用节点的Buffer对象。

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

或者您需要做的任何事情来制作正确的缓冲区。