@google-cloud/pubsub批量发布报Channel credentials类型错误如何修复
问题修复方案
问题根本原因
- @google-cloud/pubsub 2.18.1版本内部默认使用
@grpc/grpc-js作为gRPC实现,你代码中手动传入的是已经废弃的旧版grpc包(v1.24.11),两个包导出的ChannelCredentials类型不兼容,触发类型校验报错。 - 仅生产环境报错的原因通常是不同环境依赖解析结果不同:预发环境可能因为依赖提升、本地测试凭证不走gRPC认证链路等原因没有触发该校验,生产环境使用云环境默认服务账号凭证时触发了gRPC认证的类型校验。
修复步骤
方案1(最推荐,无特殊需求优先用)
直接移除代码中手动传入gRPC实例的逻辑,@google-cloud/pubsub会自动使用内置的兼容gRPC实现:
- 删除
const grpc = require("grpc");这行代码 - 把
const pubSub = new PubSub({ grpc });修改为const pubSub = new PubSub();
修改后的核心代码示例:
const { PubSub } = require("@google-cloud/pubsub"); const createPublishEventsInBatch = (fastify, topic) => { const pubSub = new PubSub(); const batchPublisher = pubSub.topic(topic, { batching: { maxMessages: 100, maxMilliseconds: 1000 } }); // 剩余业务逻辑保持不变 };
方案2(确实需要自定义gRPC实现时使用)
将旧版grpc包替换为官方推荐的@grpc/grpc-js:
- 安装新的gRPC依赖:
npm install @grpc/grpc-js - 卸载旧的废弃依赖:
npm uninstall grpc - 修改引入代码:
const grpc = require("@grpc/grpc-js");
修改完成后保持PubSub初始化时传入grpc参数的逻辑即可。
额外优化建议
你当前代码中调用batchPublisher.publish时没有处理返回的Promise,这也是报错中出现UnhandledPromiseRejectionWarning的直接原因,建议添加异常捕获逻辑,避免发布失败时进程无预警崩溃:
// 示例:添加错误捕获 batchPublisher.publish(Buffer.from(JSON.stringify(event))) .catch(err => { fastify.log.error({ err, logTrace, data }, "事件发布失败"); });
同时建议统一所有环境的依赖版本,使用package-lock.json或yarn.lock锁定依赖版本,避免不同环境安装的依赖版本不一致导致的兼容性问题。
内容的提问来源于stack exchange,提问作者viz_tm
相关产品推荐
相关产品推荐

