【问题标题】:Firebase Function, Firestore, & Axios - Error: Value for argument "data" is not a valid Firestore documentFirebase 函数、Firestore 和 Axios - 错误:参数“data”的值不是有效的 Firestore 文档
【发布时间】:2021-08-14 14:00:01
【问题描述】:

在 Axios 中使用 Firebase 函数。只是尝试遍历对象的响应对象并将每个子对象作为 Firestore Doc 存储在集合中。

日志显示以下错误:

错误:参数“data”的值不是有效的 Firestore 文档。输入不是普通的 JavaScript 对象。

在 Object.validateDocumentData (/workspace/node_modules/@google-cloud/firestore/build/src/write-batch.js:576:15)
在 CollectionReference.add (/workspace/node_modules/@google-cloud/firestore/build/src/reference.js:1964:23)
在 /workspace/index.js:35:18
在 Array.map()
在 /workspace/index.js:34:14
在 processTicksAndRejections (internal/process/task_queues.js:97:5)

代码如下:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
const axios = require("axios");

admin.initializeApp();
const db = admin.firestore();

exports.scheduledFunction = functions.pubsub
    .schedule("every 2 minutes")
    .timeZone("America/New_York")
    .onRun(async (context) => {
      try {
        const querySnapshot = await
        db.collection("my_collection").get();
        const promises = querySnapshot.docs.map((doc) =>
          db.collection("my_collection").doc(doc.id).delete());

        await Promise.all(promises);

        const Options = {
          method: "get",
          url: "...",
          headers: {
            "Cookie": "...",
            "Content-Type": "application/json",
          },
        };

        const axiosResponse = await axios(Options);
        const axiosData = axiosResponse.data;
        const parsedAxiosResponse = axiosData["news_results"];

        const documentCreationPromises = parsedResponse
            .map(() => db.collection("my_collection")
                .add(parsedAxiosResponse));

        await Promise.all(documentCreationPromises);

        return null;
      } catch (error) {
        console.log(error);
        return null;
      }
    }); 

【问题讨论】:

  • 你能console.log(parsedResponse)分享输出吗?
  • parsedResponse 从未在您共享的代码中声明或初始化,这意味着您应该在parsedResponse.map(...) 上收到错误。
  • @FrankvanPuffelen - 这对我来说是一个不相关的类型。现在在上面修复。
  • 那么parsedAxiosResponse 是什么?如果是字符串 (json / html / xml, ...) 而不是 Javascript 对象(解析后的 JSON),显然它不能作为文档存储到 Firestore。并且仍然没有在任何地方定义parsedResponse,即使您将它映射为应该是一个数组。
  • console.log of parsedAxiosResponse 显示 [object Object]、[object Object]、[object Object] 等。我想我可能需要解析它。当我执行 axiosData = JSON.partse(axiosResponse.data) 时,我收到一条错误消息 SyntaxError: Unexpected token o in JSON at position 1。我对 Axios 的菜鸟理解是它会为你自动解析数据,默认返回一个 JS 对象。所以我不应该需要 json.parse,对吧?

标签: node.js firebase google-cloud-firestore axios


【解决方案1】:

parsedAxiosResponse 似乎是一个数组,您正在尝试将该数组本身设置为所有新的 Firestore 文档,而不是该数组中的元素。

const colRef = db.collection("my_collection")

const parsedAxiosResponse = axiosData["news_results"];

const documentCreationPromises = parsedResponse.map(() => colRef.add(parsedAxiosResponse));
                                                                     ^^^^^

由于您需要为该数组中的每个对象创建一个新文档,请尝试以下操作:

const parsedAxiosResponse = axiosData["news_results"];

const documentCreationPromises = parsedResponse.map((element) => colRef.add(element));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 2021-03-15
    • 2021-03-24
    • 2020-10-25
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多