☰
用 google-api-nodejs-client 的 cloudsupport 模块管理 Google Cloud 技术支持案例(Case)全流程
2026/10/15 17:32:43 网站建设 项目流程
  • 后端

【免费下载链接】google-api-nodejs-client

Google's officially supported Node.js client library for accessing Google APIs. Support for authorization and authentication with OAuth 2.0, API Keys and JWT (Service Tokens) is included.

项目地址:https://gitcode.com/gh_mirrors/go/google-api-nodejs-client
点击查看免费下载

导读

cloudsupport是 Google 官方 Node.js 客户端库 google-api-nodejs-client 中封装Google Cloud Support API的独立模块,用于以编程方式管理 Customer Care 服务下的技术支持案例(support case):创建、查询、筛选、更新、关闭与升级案例,围绕案例展开评论与附件交互,并为组织订阅支持事件通知。读完本文,你将掌握基于@googleapis/cloudsupport包的认证接入方式、v2 版本完整的资源调用链(案例分类、案例、媒体附件、组织订阅),以及过滤表达式、分页、字段掩码等关键参数的实战用法。

服务定位与支持状态:维护模式下的取舍

Cloud Support API 的功能定位在 README 中一句话概括:Manages Google Cloud technical support cases for Customer Care support offerings,即管理 Google Cloud 客户关怀(Customer Care)支持服务中的技术工单。

当前仓库中该模块的 README 明确给出了一条重要的选型提示:

  • 本库(@googleapis/cloudsupport)处于维护模式(maintenance mode),会继续为已有存量应用提供支持;
  • 如果你正在构建新应用或现代化改造旧应用,应改用 Google 专门维护的@google-cloud/support库(该库更快、更易用、维护更活跃);
  • 更多背景可参考 Google Cloud 官方的 Client Libraries Explained 文档。

因此,本文面向的是:已经使用googleapis/@googleapis/cloudsupport的存量项目、以及需要理解其 API 语义以进行迁移或对照的场景。从仓库当前代码看,模块仍保持完整维护:src/apis/cloudsupport/package.json中版本号为22.0.2,要求 Node.js>=22.0.0,唯一运行时依赖为googleapis-common ^9.0.0,并通过src/apis/cloudsupport/CHANGELOG.md持续记录变更。

安装与快速接入

该模块与主库googleapis解耦,可独立安装:

$ npm install @googleapis/cloudsupport

安装完成后,在代码中通过googleapis主库或独立入口获取客户端。入口文件 src/apis/cloudsupport/index.ts 揭示了模块结构:它导出VERSIONS(v2与v2beta两个版本)、cloudsupport()工厂函数以及AuthPlus认证实例;v2.ts与v2beta.ts分别生成自对应的 discovery 文档。

最小可用示例(对应v2.ts中每个方法示例的统一骨架):

const {google} = require('googleapis'); const cloudsupport = google.cloudsupport('v2'); async function main() { const auth = new google.auth.GoogleAuth({ // 支持云平台全量权限 scopes: ['https://www.googleapis.com/auth/cloud-platform'], }); // 获取认证客户端并绑定到所有后续请求 const authClient = await auth.getClient(); google.options({auth: authClient}); // 发起第一个 API 调用,例如获取案例 const res = await cloudsupport.cases.get({ name: 'projects/my-project/cases/123456', }); console.log(res.data); } main().catch(e => { console.error(e); throw e; });

认证方面,v2.ts中的StandardParameters.auth字段(v2.ts)接受多种客户端类型:OAuth2Client、JWT(服务账号)、Compute(GCE 元数据)、UserRefreshClient、BaseExternalAccountClient以及GoogleAuth,也可以直接传字符串形式的 API Key。请求发出前建议先在本地执行gcloud auth application-default login获取应用默认凭据,并在 Google Cloud Console 中启用cloudsupport.googleapis.comAPI。

客户端资源结构:从源码看 API 全貌

通过src/apis/cloudsupport/v2.ts中Cloudsupport类的构造函数(v2.ts)可以清晰看到 v2 客户端的四大顶层资源:

顶层资源源码位置子资源 / 说明
caseClassificationsResource$Caseclassifications查询合法的问题分类,用于创建案例
casesResource$Cases案例本体;下辖attachments与comments两个子资源
mediaResource$Media附件的上传(upload)与下载(download)
organizationsResource$Organizations组织级支持事件订阅supportEventSubscriptions

调用时路径形如cloudsupport.cases.attachments.list(...)、cloudsupport.organizations.supportEventSubscriptions.create(...)。每个方法都支持 Promise(async/await)、回调(callback)与流式响应(StreamMethodOptions返回Readable)三种调用形态,内部统一经由googleapis-common的createAPIRequest转发。

第一步:检索案例分类(Case Classifications)

创建案例前必须先取得合法的classification.id——分类用于将工单路由给对应领域的支持专家。调用caseClassifications.search(v2.ts):

const res = await cloudsupport.caseClassifications.search({ // 每页返回的最大分类数 pageSize: 100, // 分页令牌,第一页可省略 pageToken: '...', // 过滤表达式,例如按显示名模糊匹配 query: 'display_name:"*Compute Engine*"', }); console.log(res.data.caseClassifications);

关键语义(来自源码注释与Schema$CaseClassification,v2.ts):

  • 分类是层级化的,displayName形如"Technical Issue > Compute > Compute Engine",且显示名不保证稳定,唯一稳定的标识符是id;
  • search返回的分类 ID至少 6 个月内有效;一旦分类被停用,search会立即停止返回它,而 6 个月后继续使用该 ID 调用cases.create将会失败;
  • 因此生产环境应定期重新查询分类 ID 并缓存刷新,不要将分类 ID 硬编码为长期常量。

案例全生命周期:创建、查询、更新、关闭与升级

创建案例(cases.create)

cases.create(v2.ts)向POST /v2/{parent}/cases发起请求,parent为必填,取值形如projects/my-project或organizations/123。源码注释明确要求创建时必须设置四个字段:displayName、description、classification、priority。

const res = await cloudsupport.cases.create({ parent: 'projects/some-project', requestBody: { displayName: 'A Test Case', description: 'This is a test case.', testCase: true, // 仅测试 API、不想路由给真实客服代理时设为 true priority: 'P2', classification: { id: '100IK2AKCLHMGRJ9CDGMOCGP8DM6UTB4BT...', }, subscriberEmailAddresses: ['foo@domain.com', 'bar@domain.com'], timeZone: '-07:00', }, });

Schema$Case(v2.ts)的完整字段值得逐一看过:priority取值P0–P4;languageCode使用 BCP 47 语言代码(如"en"、"zh-CN"、"ja"),未指定或不受支持时默认en,且创建时的语言选择可能影响可用的支持选项;contactEmail在使用 Workforce Identity Federation(BYOID)流程认证时必须显式设置,否则由凭据推断;state、createTime、updateTime、creator等为输出字段(Output only),服务端返回,输入时忽略。

查询与筛选案例(cases.get / list / search)

三个查询接口的差别值得关注:

  • cases.get:按完整资源名精确取单个案例(Params$Resource$Cases$Get),name必填;
  • cases.list:列出父资源下的案例,必须通过parent指定所属项目或组织,并用filter表达式过滤(Params$Resource$Cases$List);
  • cases.search:跨字段全文检索,parent指定范围,用query表达式过滤(Params$Resource$Cases$Search)。

list的filter与search的query共享一套表达式语法,核心要素如下:

字段取值范围 / 说明示例
stateOPEN或CLOSEDstate=CLOSED
priorityP0、P1、P2、P3、P4;多值用ORstate=OPEN AND (priority=P0 OR priority=P1)
creator.email创建者邮箱精确匹配state=OPEN AND creator.email="tester@example.com"
update_time(仅 search)ISO 日期时间,仅支持大于运算符>update_time>"2020-01-01T00:00:00-05:00"
全局限制词search中不带关键字的短语可全文检索 displayName/description/评论"my search"

分页方面,pageSize默认值为10,nextPageToken透传回pageToken即可翻页(见 Schema$SearchCasesResponse 与 Schema$ListCasesResponse)。

更新案例(cases.patch)

cases.patch的关键参数是updateMask(Params$Resource$Cases$Patch),源码注释给出了非常实用的提醒:

  • 支持的更新字段:priority、display_name、subscriber_email_addresses;
  • 若省略字段掩码,将更新所有支持字段——例如你不提供subscriber_email_addresses的值,它会被清空。因此生产代码务必显式指定updateMask,避免误清字段。
const res = await cloudsupport.cases.patch({ name: 'projects/my-project/cases/123456', updateMask: 'priority,subscriber_email_addresses', requestBody: { priority: 'P1', subscriberEmailAddresses: ['ops@example.com'], }, });

关闭与升级(cases.close / cases.escalate)

  • cases.close(v2.ts):POST /v2/{name}:close,name必填,请求体为空对象,返回更新后的Case;
  • cases.escalate(v2.ts 附近):启动 Google Cloud 支持升级流程。请求体escalation必须包含reason与justification(见 Schema$Escalation)——reason是升级原因枚举(如示例中的BUSINESS_IMPACT),justification是补充上下文自由文本。注意:升级操作仅对部分支持服务开放,需确认你的支持套餐在功能清单中包含 Technical support escalations。

围绕案例的协作:评论与附件

评论(cases.comments)

评论是用户与 Google 支持团队沟通的主要载体(Schema$Comment):

  • cases.comments.create(Params$Resource$Cases$Comments$Create):向案例追加评论,parent必填,body为评论正文,最大 12800 字符;
  • cases.comments.get:按名称取单条评论;
  • cases.comments.list:列出案例下所有评论,pageSize默认 10,支持分页(Params$Resource$Cases$Comments$List)。
await cloudsupport.cases.comments.create({ parent: 'projects/my-project/cases/123456', requestBody: {body: '补充信息:已排查到具体报错日志,见附件。'}, });

附件(cases.attachments 与 media)

附件模型有两个层面,容易混淆,源码注释讲得很清楚:

  • Schema$Attachment(v2.ts)是元数据对象,不是文件本身,包含name、filename、mimeType、sizeBytes、createTime、creator等输出字段;附件按"案例"级别关联,而非"评论"级别;
  • 真正的文件字节流通过media资源传输:
    • media.upload(v2.ts):POST /upload/v2/{parent}/attachments,parent为案例资源名,请求体只需提供filename,媒体内容通过media.body(可传文件流/缓冲)与media.mimeType指定,返回附件元数据;
    • media.download(v2.ts):GET /v2/{name}:download,name为附件资源名。注意:该端点不返回响应体 JSON,而是直接返回附件二进制内容,且要求 URL 附加?alt=media。
// 上传附件 const res = await cloudsupport.media.upload({ parent: 'projects/my-project/cases/123456', media: { mimeType: 'text/plain', body: 'This text is inside a file...', // 或 fs.createReadStream(...) }, requestBody: {attachment: {filename: 'example_file.txt'}}, }); // 下载附件(流式) const {data} = await cloudsupport.media.download({ name: 'projects/my-project/cases/123456/attachments/0684M00000P3h1fQAB', }, {responseType: 'stream'}); data.pipe(process.stdout);

同时cases.attachments.get/cases.attachments.list(v2.ts 起)用于读取附件元数据列表。

进阶:组织级支持事件订阅(Support Event Subscriptions)

v2 版本还提供了面向组织的事件订阅能力:organizations.supportEventSubscriptions(v2.ts)允许你订阅 Pub/Sub 主题,以便在支持案例发生事件时实时收到通知。Schema$SupportEventSubscription(v2.ts)要求pubSubTopic字段,格式为projects/{project}/topics/{topic};state字段在订阅失败(FAILING)时会携带failureReason。

可用方法(对应参数接口见 v2.ts):

  • create:为组织创建订阅,parent格式organizations/{organization_id};
  • get:按名称读取,名称格式organizations/{organization_id}/supportEventSubscriptions/{subscription_id};
  • list:列出订阅,支持filter过滤(可组合pub_sub_topic与state,例如pub_sub_topic="projects/example-project/topics/example-topic" AND state=WORKING);
  • update:更新订阅;
  • delete/expunge:删除订阅,expunge用于彻底清除(请求体为空对象)。
await cloudsupport.organizations.supportEventSubscriptions.create({ parent: 'organizations/123456789', requestBody: {pubSubTopic: 'projects/my-project/topics/my-topic'}, });

源码注释还提到,同一功能也可通过gcloud support support-event-subscriptions命令或 Terraform 的google_cloud_support_support_event_subscription资源管理,适合在基础设施即代码(IaC)场景中替代直接 API 调用。

通用参数与请求选项

每个方法都继承StandardParameters(v2.ts),可用于细粒度控制:

  • 认证类:auth(客户端或 API Key)、key(API key,未提供 OAuth token 时必需)、access_token、oauth_token;
  • 响应格式:alt(数据格式)、fields(部分响应字段选择器)、prettyPrint、callback(JSONP 回调);
  • 配额与审计:quotaUser(服务端应用配额区分,任意字符串,不超过 40 字符)、$.xgafv(v1 错误格式);
  • 上传协议:uploadType(如"media"、"multipart")、upload_protocol。

所有方法均可在第二参数中覆盖请求选项(如rootUrl、method、encoding),并支持流式响应模式;rootUrl默认指向https://cloudsupport.googleapis.com/,媒体上传走/upload/路径——这一点在media.upload的mediaUrl配置中体现得最明显。

最佳实践小结

  1. 选型先行:新项目优先评估@google-cloud/support;存量项目可继续使用本模块,但需关注维护状态;
  2. 分类 ID 定期刷新:caseClassifications.search返回的 ID 至少 6 个月有效,建议缓存并按需重查;
  3. 字段掩码必填:cases.patch不指定updateMask会整体覆盖支持字段,容易误清subscriber_email_addresses;
  4. 测试工单隔离:仅验证 API 流程时设置testCase: true,避免工单被路由给真实客服代理;
  5. 分页不可忽略:list/search默认每页 10 条,务必循环消费nextPageToken;
  6. 媒体端点语义:media.download需要?alt=media且返回二进制而非 JSON,与cases.attachments的元数据接口用途不同。

许可证与贡献

本模块遵循 Apache 2.0 许可证,完整许可证文本位于仓库根目录 LICENSE。欢迎以 issue 先行、再提交 Pull Request 的方式参与贡献,规范见 CONTRIBUTING.md;遇到问题可通过 StackOverflow 的google-api-nodejs-client标签提问,或到仓库 issues 反馈缺陷。仓库根目录的 README.md 与googleapis主入口 src/googleapis.ts 可帮助你进一步了解整个客户端库的集成方式。

  • 后端

【免费下载链接】google-api-nodejs-client

Google's officially supported Node.js client library for accessing Google APIs. Support for authorization and authentication with OAuth 2.0, API Keys and JWT (Service Tokens) is included.

项目地址:https://gitcode.com/gh_mirrors/go/google-api-nodejs-client
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询