@google-cloud/iot API是否有正式可用文档?接口与文档不符如何解决
问题原因
@google-cloud/iot 属于Google Cloud官方gRPC体系Node.js客户端,所有异步RPC方法的返回值都是固定三元组结构:[响应实例, 请求元数据, 原始gRPC响应],官方文档漏写了这个结构说明,才会和标注的单个SendCommandToDeviceResponse返回类型不符。你await拿到的r就是这个三元数组,第一个元素才是符合类型定义的响应对象。
修复方案
- 调用时直接解构取第一个元素即可,自动匹配对应类型,
toJSON()方法也可以正常调用:
// 解构取第一个元素就是符合类型定义的SendCommandToDeviceResponse实例 const [response] = await client.sendCommandToDevice(request); // 直接调用toJSON即可得到序列化后的JSON数据 const jsonResult = response.toJSON();
- 你现有的
generateRequest方法返回的参数结构不符合接口要求:接口要求的二进制字段名为binaryData而非binData,额外的ok字段无意义会被忽略,修正后的写法:
function generateRequest(id: string, data: any) { const formattedName = client.devicePath("myproject", "us-central1", "myregistry", id); const binData = Buffer.from(JSON.stringify(data)).toString("base64"); return { name: formattedName, binaryData: binData, }; }
client.updateDevice()、client.modifyCloudToDeviceConfig等同系列方法都可以用同样的解构方式拿到正确的响应实例。
相关问题解答
- 这类类型标注不符的问题不是仓促迁移TS导致的,是官方文档没有同步标注客户端统一的三元组返回结构,底层JS接口的行为从早期版本开始就是返回三元组,不存在兼容性变化。
- 旧版JS接口的行为和当前版本完全一致,只是没有TS类型定义,不需要额外找旧文档对比。
完整修正后代码
// node 14.17.3, TypeScript 4.4.4, iot 2.5.1 import iot from "@google-cloud/iot"; const client = new iot.v1.DeviceManagerClient(); function generateRequest(id: string, data: any) { const formattedName = client.devicePath("myproject", "us-central1", "myregistry", id); const binData = Buffer.from(JSON.stringify(data)).toString("base64"); return { name: formattedName, binaryData: binData, }; } async function run() { const project = await client.getProjectId(); const parent = client.locationPath(project, 'us-central1'); const deviceId = "d99999995"; const data = { get: [ "program" ] }; const request = generateRequest(deviceId, data); // 解构拿到响应实例 const [response] = await client.sendCommandToDevice(request); const jsonResult = response.toJSON(); return { ok: true, result: jsonResult, }; } run().catch((err) => { console.error(err); });
内容的提问来源于stack exchange,提问作者Lee Daniel Crocker
相关产品推荐
相关产品推荐

