- 后端
【免费下载链接】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.
导读
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 客户端的四大顶层资源:
| 顶层资源 | 源码位置 | 子资源 / 说明 |
|---|---|---|
caseClassifications | Resource$Caseclassifications | 查询合法的问题分类,用于创建案例 |
cases | Resource$Cases | 案例本体;下辖attachments与comments两个子资源 |
media | Resource$Media | 附件的上传(upload)与下载(download) |
organizations | Resource$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共享一套表达式语法,核心要素如下:
| 字段 | 取值范围 / 说明 | 示例 |
|---|---|---|
state | OPEN或CLOSED | state=CLOSED |
priority | P0、P1、P2、P3、P4;多值用OR | state=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。
- media.upload(v2.ts):
// 上传附件 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配置中体现得最明显。
最佳实践小结
- 选型先行:新项目优先评估
@google-cloud/support;存量项目可继续使用本模块,但需关注维护状态; - 分类 ID 定期刷新:
caseClassifications.search返回的 ID 至少 6 个月有效,建议缓存并按需重查; - 字段掩码必填:
cases.patch不指定updateMask会整体覆盖支持字段,容易误清subscriber_email_addresses; - 测试工单隔离:仅验证 API 流程时设置
testCase: true,避免工单被路由给真实客服代理; - 分页不可忽略:
list/search默认每页 10 条,务必循环消费nextPageToken; - 媒体端点语义:
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.
相关推荐
BigBlueButton TURN 服务器部署与配置完全指南:基于 coturn 打通受限网络下的 WebRTC 音视频连接
BigBlueButton TURN 服务器部署与配置完全指南:基于 coturn 打通受限网络下的 WebRTC 音视频连接 本文以 BigBlueButto
后端google-api-nodejs-client 中的 certificatemanager 模块:使用 Node.js 管理 Google Certificate Manager 证书
google api nodejs client 中的 certificatemanager 模块:使用 Node.js 管理 Google Certifica
后端google-api-nodejs-client 中的 Batch API 客户端:使用 @googleapis/batch 管理 Google Cloud Batch 作业
google api nodejs client 中的 Batch API 客户端:使用 @googleapis/batch 管理 Google Cloud B
后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考