所以,我需要做的基本上是,当我在谷歌云Firestore中更改一个值时,它会触发一个云功能,将该值发送到一个物联网设备。以下是我所做的:
const functions = require("firebase-functions");
const admin = require("firebase-admin");
const iot = require("@google-cloud/iot");
const app = admin.initializeApp();
const firestore = app.firestore();
const client = new iot.v1.DeviceManagerClient();
firestore.settings({ timestampsInSnapshots: true });
exports.deviceConfigs = functions.firestore
.document("device-configs/{device}")
.onWrite(async (change, context) => {
const deviceId = context.params.device;
if (!change.after.exists) {
functions.logger.error(`Device configurations removed for ${deviceId}`);
return;
}
const config = change.after.data();
const formattedName = client.devicePath(
process.env.GCLOUD_PROJECT,
functions.config().iot.core.region,
functions.config().iot.core.registry,
deviceId
);
const request = {
name: formattedName,
binaryData: Buffer.from(JSON.stringify(config)).toString("base64"),
};
await client.modifyCloudToDeviceConfig(request);
});
因此,每当我在集合“device-configs”中写入文档时,该功能将被触发,并向IoT设备发送一个自动请求,通知配置更改。它被认证是因为它是直接从google后端运行的,因为它是一个云功能,所以它应该被认证为我创建的服务帐户。
然而,每次它被触发时,它在最后一行失败。错误如下:
错误:7 permission_dention:调用方在object没有权限。callerrorfromstatus(/workspace/node_modules/@grpc/grpc-js/build/src/call.js:31:26)在object.onreceivestatus(/workspace/node_modules/@grpc/grpc-js/build/src/client.js:176:52)在object.build/src/client-interceptors.js:299:181)在/workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:145:78在processTicksAndRejections(internal/process/task_queues.js:79:11)
我真的不知道该怎么办了。我尝试在模拟器上本地运行它,使用服务密钥作为身份验证,但它仍然返回相同的错误。我试图找到一种方法来记录Google Cloud收到的所有api请求,以查看头上是否存在身份验证,但我找不到这样做的方法。
好吧,我不知道这是否有帮助,但我还有另一个云功能,它监听PubSub主题的新消息,并相应地更新Firestore数据库。这个功能运行良好。代码如下:
const functions = require("firebase-functions");
const admin = require("firebase-admin");
const iot = require("@google-cloud/iot");
const app = admin.initializeApp();
const firestore = app.firestore();
const client = new iot.v1.DeviceManagerClient();
firestore.settings({ timestampsInSnapshots: true });
exports.deviceState = functions.pubsub
.topic("device-events")
.onPublish(async (message) => {
functions.logger.warn("Mensagem:", { message });
const deviceId = message.attributes.deviceId;
const deviceRef = firestore.doc(`device-state/${deviceId}`);
try {
await deviceRef.update({
state: message.json,
online: true,
});
functions.logger.log("Device updated successfully");
} catch (error) {
functions.logger.error(error);
}
});
基本上,确保tripple、quadrupple检查项目和注册表名称!逐个字符检查。这件事花了我整整4天的时间才解决。
我正在尝试Google Cloud Vision API(测试版),它返回“权限被拒绝”消息。但该项目启用了“云视觉API”。感谢您的帮助。 谷歌API浏览器中的错误详细信息
当尝试以构建容器映像时,我得到一个: 错误:(gcloud.builds.submit)HTTPError 403:权限不足 我正在从一个compute VM实例中进行尝试,在该实例中,使用服务帐户设置了gcloud。
我创建了一个服务帐户,并为其分配了访问云功能的权限: gcloud beta函数add-iam-policy-binding MyFunction--member=serviceaccount:cf-access@my-project.iam.gserviceaccount.com--role=roles/cloudfunctions.admin 产出: 现在,我下载了服务帐户json文件。 所以
我不能让谷歌云功能运行超过60秒,即使超时设置为540秒!!有什么建议吗? 我将部署时的超时标志设置为--timeout=540,并且我知道该设置会通过,因为在GCP WEB UI中会显示540秒的超时设置。我还尝试通过GCP WEB UI手动编辑超时至540。但无论如何,我还是在大约62000毫秒后超过了最后期限。 我已经尝试了pub/sub和https方法作为func触发器,但是仍然在60度左
问题内容: 我运行 npm install lodash, 但它抛出 错误:EACCES:权限被拒绝 错误。我知道这是权限问题,但据我所知,本地安装节点模块不需要sudo权限。如果我使用sudo运行它,它将安装在〜/ node_modules文件夹中。 drwxrwxr-x 是现有文件夹的文件许可权。我不知道可能出了什么问题。 下面是错误消息。 问题答案: 使用 npm init 创建 packa
我运行npm install lodash,但它抛出错误:EACCES:权限被拒绝错误。我知道这是权限问题,但据我所知,在本地安装节点模块不需要sudo权限。如果我用sudo运行它,它会安装在~/node\u modules文件夹中。drwxrwxr-x是现有文件夹的文件权限。我不知道可能出了什么问题。 下面是错误消息。