firebase 如何获取事件值为json时,使用谷歌云Firestore触发器?

8mmmxcuj  于 2023-02-25  发布在  其他
关注(0)|答案(1)|浏览(110)

我正在使用Google Cloud Firestore触发器来触发一个云函数,当一个文档在Firestore中创建时。它工作正常,但我找不到如何获得json的有效负载。几乎所有我做的是:

/* Triggered when a comment is created, updated or deleted.
* Trigger resource is: 
* 'projects/myproj/databases/(default)/documents/books/{bookId}'
*/
exports.bookAdded = async (event, context) => {
    let data = event.value;
    console.log(data);
}

在上面打印data如下所示:

{
    createTime: '2023-02-22T07:17:31.413935Z',
    fields: {
        title: { stringValue: 'The Breaker' },
        author: { stringValue: 'Don Gold' },
    },
    name: 'projects/myproj/databases/(default)/documents/books/38',
    updateTime: '2023-02-22T07:17:31.413935Z'
}

是否有一个API方法可以将fields属性作为“普通”json(即没有类型定义)来获取?

澄清---------

对于“普通”json,我的意思是没有类型信息,但是以名称/值格式获取fields数据,在上面的示例中,它将是{ title: 'The Breaker', author: 'Don Gold' }
我最初希望Firestore Events文档中使用的data()方法可以工作,但它没有:在该库中,可以执行以下操作:

exports.createUser = functions.firestore
.document('users/{userId}')
.onCreate((snap, context) => {
  // Get an object representing the document
  // e.g. {'name': 'Marie', 'age': 66}
  const newValue = snap.data();
  ...

我正在寻找一个与该数据方法等效的方法。

t9aqgxwy

t9aqgxwy1#

您可以花时间摆弄protobufjs以使其工作,或者您可以组合一个解决方案,如下面所示:

    • 注意**:这并不适用于所有支持的数据类型,这些数据类型被编码为与protobuf一起使用,我只实现了下面的possible types中的一小部分。

假设event.value如下所示:

{
    "createTime": "2023-02-22T07:17:31.413935Z",
    "fields": {
        "title": { "stringValue": "The Breaker" },
        "author": { "stringValue": "Don Gold" },
    },
    "name": "projects/myproj/databases/(default)/documents/books/38",
    "updateTime": "2023-02-22T07:17:31.413935Z"
}
const lazyDecodeProtobuf = (rawObj) => {
  if ("fields" in rawObj) { // handles MapValues
    let fieldName, decoded = {}, fieldsObj = rawObj.fields;
    for (fieldName in fieldsObj) {
      decoded[fieldName] = lazyDecodeProtobuf(fieldsObj[fieldName])
    }
    return decoded;
  } else if ("values" in rawObj) { // handles ArrayValues
    return rawObj.values.map(lazyDecodeProtobuf);
  }

  let fieldName, protobufType, rawValue;
  for (protobufType in rawObj) {
    rawValue = rawObj[protobufType];
    switch (protobufType) { // TODO: handle special types as needed
      case "timestampValue": // Example: converts timestamp objects to JS Dates
        return new Date(rawValue.seconds * 1e3 + rawValue.nanos / 1e6);
      case "integerValue":
        return Number(rawValue); // use with care
      default: // use value as-is (works for strings, booleans, nulls)
        return rawValue;
    }
  }
}

const data = lazyDecodeProtobuf(event.value);
console.log(JSON.stringify(data, null, 2));
// logs:
// {
//  "title": "The Breaker",
//  "author": "Don Gold"
// }

请参阅list of possible values,了解Firestore可能会遇到的不同类型(如时间戳和ArrayValue。protobuf支持broader set of types,但并非所有类型都受Cloud Firestore文档支持。

相关问题