首页 > 解决方案 > Cloud Function 无法写入 Cloud Firestore 中的 Map 数据类型

问题描述

我有一个将 JSON 发布到我的云函数触发器 URL 的 Webhook。

我希望 Cloud Function 解析 JSON 并将其写入我的 Cloud Firestore。

我已经在 webhook.site 和 requestbin.com 上测试了 Webhook:他们都完美地接收了 POST 请求。

此外,这不是经过身份验证的请求,我通过 Google Cloud Platform - Cloud Function Console 部署了该功能。我没有通过 CLI 或通过使用 firebase 的应用程序设置来部署它。

此功能确实需要 HTTPS。

我能够让我的函数写入 Firestore,但它没有写入 Map 中的字段 - 我在底部包含了屏幕截图,以显示我的 Firestore 在 Firebase / Google Cloud Platform Console 中的样子。

我需要提供什么语法来确保我的 Cloud Function 采用 JSON 并写入 Firestore,同时尊重 Map 数据类型?

我需要声明 people_Email = map 吗?如果我这样做了,那将如何实现?

index.js

const admin = require('firebase-admin')
admin.initializeApp();

exports.wooCommerceWebhook = async (req, res) => {
    const payload = req.body;

    var billing = ""; // Do I even need to declare every nest of the complex JSON?
        var people_EmailHome = "";
        var people_FirstName = "";
        var people_LastName = "";

    // Write to Firestore - People Collection
    await admin.firestore().collection("people").doc().set({
        people_EmailHome: payload.billing.email,
        people_FirstName: payload.billing.first_name,
        people_LastName: payload.billing.last_name,
    });

    return res.status(200).end();

};

包.json

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
      "firebase-admin": "^9.4.2"
  }
}

我的 Webhook 将 POST JSON 传送到我的 Cloud Function URL:

{
     "billing": {
          "email": "test@test.com",
          "first_name": "First",
          "last_name": "Last"
     }
}

我的 Cloud Firestore 的屏幕截图 在此处输入图像描述

在此处输入图像描述

标签: node.jsfirebaseexpressgoogle-cloud-firestoregoogle-cloud-functions

解决方案


我需要提供什么语法来确保我的 Cloud Function 采用 JSON 并写入 Firestore,同时尊重 Map 数据类型?

以下将解决问题:

const admin = require('firebase-admin')
admin.initializeApp();

exports.wooCommerceWebhook = async (req, res) => {
    const payload = req.body;

    await admin.firestore().collection("people").doc().set({
       people_Email: { people_EmailHome: payload.billing.email },
       people_Names: { people_FirstName: payload.billing.first_name, people_LastName: payload.billing.last_name }
    });

    return res.status(200).end();

};

推荐阅读