我尝试从云函数发送命令,但收到错误:服务当前不可用。
Package.JSON"依赖项":{"firebase admin":"~6.0","firebase函数":"^2.0.3","googleapi":"34.0.0"}
const parentName = `projects/${projectId}/locations/${cloudRegion}`;
const registryName = `${parentName}/registries/${reqData.registryId}`;
const binaryData = Buffer.from(JSON.stringify(reqData.message)).toString('base64');
const request = {
name: `${registryName}/devices/${reqData.deviceId}`,
binaryData: binaryData
};
google.auth.getClient().then((authClient) => {
const discoveryUrl =
`${DISCOVERY_API}?version=${API_VERSION}`;
if (authClient.createScopedRequired && authClient.createScopedRequired()) {
// Scopes can be specified either as an array or as a single,
// space-delimited string.
authClient = authClient.createScoped([
'https://www.googleapis.com/auth/cloud-platform'
]);
}
google.options({
auth: authClient
});
google.discoverAPI(discoveryUrl).then((client, err) => {
if (err) {
console.log('Error during API discovery', err);
return undefined;
}
client.projects.locations.registries.devices.sendCommandToDevice(request,
(err, data) => {
if (err) {
console.log('Could not send command:', request);
console.log('Message: ', err);
} else {
console.log('Success :', data.statusText);
}
});
});
});
日志:{错误:该服务当前不可用。在Unzip.mit的emitOne(events.js:91:20(上的createError(/user_code/node_modules/googleapis/node_modules/axios/lib/core/createError.js:16:15(处(events.js:185:7(在进程的_combinedTickCallback(internal/process/next_tick.js:80:11(处的endReadableNT(_stream_readable.js:974:12(处_tickDomainCallback(internal/process/next_tick.js:128:9(
问题是必须指定subfolder
,并且必须不是空字符串。
当我在Firebase函数中使用它时,我只将firebase
子文件夹用于发送的任何没有特定子文件夹的命令
const request = {
name: `${registryName}/devices/${deviceId}`,
binaryData: Buffer.from(JSON.stringify(commandMessage)).toString("base64"),
subfolder: 'firebase'
}
以下是deps的功能:
"dependencies": {
"firebase-admin": "^6.4.0",
"firebase-functions": "^2.1.0",
"fs-extra": "^7.0.0",
"googleapis": "^36.0.0",
},
这可能是由于
节点库中的- 错误
- 谷歌端点中的错误
- 谷歌方面缺乏测试
看来谷歌的"物联网"还很年轻,需要做很多工作
我对Firebase云函数不太熟悉,但我没有使用云函数的内联编辑器得到错误(https://console.cloud.google.com/functions)。你能告诉我你是什么时候开始出现这个错误的吗(如果你仍然遇到它(?
作为参考,以下是我使用的代码(基本上是您所拥有的,但对projectId, cloudRegion
有更明确的定义
const {google} = require('googleapis');
const API_VERSION = 'v1';
const DISCOVERY_API = 'https://cloudiot.googleapis.com/$discovery/rest';
exports.sendCommand = (req, res) => {
let reqData = req.body;
const projectId = reqData.projectId || process.env.GCLOUD_PROJECT;
const cloudRegion = reqData.cloudRegion || process.env.GCLOUD_REGION;
const parentName = `projects/${projectId}/locations/${cloudRegion}`;
const registryName = `${parentName}/registries/${reqData.registryId}`;
const binaryData = Buffer.from(JSON.stringify(reqData.message)).toString('base64');
const request = {
name: `${registryName}/devices/${reqData.deviceId}`,
binaryData: binaryData
};
google.auth.getClient().then((authClient) => {
const discoveryUrl =
`${DISCOVERY_API}?version=${API_VERSION}`;
if (authClient.createScopedRequired && authClient.createScopedRequired()) {
// Scopes can be specified either as an array or as a single,
// space-delimited string.
authClient = authClient.createScoped([
'https://www.googleapis.com/auth/cloud-platform'
]);
}
google.options({
auth: authClient
});
google.discoverAPI(discoveryUrl).then((client, err) => {
if (err) {
console.log('Error during API discovery', err);
return undefined;
}
client.projects.locations.registries.devices.sendCommandToDevice(request,
(err, data) => {
if (err) {
console.log('Could not send command:', request);
console.log('Message: ', err);
} else {
console.log('Success :', data.statusText);
}
});
});
});
res.status(200).send(reqData.message);
};