You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@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实现:

  1. 删除const grpc = require("grpc");这行代码
  2. 把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:

  1. 安装新的gRPC依赖:npm install @grpc/grpc-js
  2. 卸载旧的废弃依赖:npm uninstall grpc
  3. 修改引入代码: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:48:03