首页 > 解决方案 > Cloud Functions 将数据添加到 Firestore 时出现权限错误

问题描述

我正在尝试设置一个云函数,当由 Cloud Scheduler 运行时,它将某些数据插入到我的 Firestore 数据库中。我使用创建云函数时提供的内联编辑器在 Node.js 中执行此操作。

我不断收到错误:

“错误:函数崩溃。详细信息:7 PERMISSION_DENIED:缺少权限或权限不足。”

在我的 Firebase 仪表板上,日志显示了我的函数以及我在测试云函数时遇到的错误,所以我假设我的函数正在访问数据库,而不是添加我正在测试的虚拟数据。

index.js:

const Firestore = require('@google-cloud/firestore');
const PROJECTID = 'MY_PROJECT_ID';
const firestore = new Firestore({
  projectId: PROJECTID,
  timestampsInSnapshots: true,
});

/**
 * Responds to any HTTP request.
 *
 * @param {!express:Request} req HTTP request context.
 * @param {!express:Response} res HTTP response context.
 */
exports.helloWorld = (req, res) => {
    return firestore.collection("users").add({
    first: "Ada",
    last: "Lovelace",
    born: 1815
    });
};

包.json:

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "@google-cloud/firestore": "0.17.0",
    "semver": "^5.5.1"
  }
}

我还为我的数据库设置了规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
        allow read, write;
    }
  }
}

标签: firebasegoogle-cloud-platformgoogle-cloud-firestoregoogle-cloud-functions

解决方案


感谢@andresmijares,我能够解决我的问题。我更多地查看了快速入门,并按如下方式更改了我的 index.js(特别是 helloWorld 函数之前的所有内容)。

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

admin.initializeApp({
  credential: admin.credential.applicationDefault()
});

const db = admin.firestore();

/**
 * Responds to any HTTP request.
 *
 * @param {!express:Request} req HTTP request context.
 * @param {!express:Response} res HTTP response context.
 */
exports.helloWorld = (req, res) => {
/*  let message = req.query.message || req.body.message || 'Hello World!';
  res.status(200).send(message);
  */
    return db.collection("users").add({
    first: "Ada",
    last: "Lovelace",
    born: 1815
    });
};

我得到了错误

“无法加载文件 index.js 中的代码。您是否在 package.json 依赖项中列出了所有必需的模块?详细的堆栈跟踪:错误:找不到模块'firebase-admin'”

我可以通过将“firebase-admin”依赖项添加到我的 package.json 中来解决这个问题,如下所示:

{
  "name": "sample-http",
  "version": "0.0.1",
    "dependencies": {
    "semver": "^5.5.1",
    "@google-cloud/firestore": "^1.3.0",
    "firebase-admin": "^7.1.1"
  }
}

这也是在创建我的云函数时提供的内联编辑器中完成的,因此不需要安装任何东西。


推荐阅读