firebase - 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;
}
}
}
解决方案
感谢@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"
}
}
这也是在创建我的云函数时提供的内联编辑器中完成的,因此不需要安装任何东西。
推荐阅读
- scrapy - 我可以安全地将 Scrapy 的 HttpCacheMiddleware 移近引擎吗?
- node.js - 使用 Sequelize 模型的问题,诸如“无法读取未定义的属性‘创建’”或未定义客户端等错误
- javascript - 将字符串转换为函数,给出 ReferenceError
- python - 在正则表达式中匹配两个字母
- linux - 如何为使用 ARCH_MULTIPLATFORM=y 的 ARM 平台指定物理内存偏移量?
- php - 如果我希望我的 Laravel 项目有多个单词,我应该如何命名它?
- python - 在 ListView 中注释 QuerySet:Django
- angular - Angular 6/7:仅从 API 获取数据一次,但显示在两个路由/视图中
- c++ - 使用 << 运算符从文件中读取无符号字符
- java - 未调用自定义 Spring UserDetailsService