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

使用grpc-js创建客户端时出现TypeError: Service is not a constructor错误

解决gRPC客户端TypeError: HelloService is not a constructor错误

错误原因

你的proto文件定义了package hello,但代码里直接从loadPackageDefinition返回的顶层对象中取HelloService——实际上service是嵌套在hello这个包对象里的,而非顶层。另外如果proto-loader的配置不当,也可能导致service名称被自动转换(比如小驼峰),引发找不到构造函数的问题。

修复步骤

  1. 修正Service获取路径
    必须先获取hello包对象,再从中取出HelloService,同时确保proto-loader配置保留原始命名:

    const grpc = require('@grpc/grpc-js');
    const protoLoader = require('@grpc/proto-loader');
    
    // 加载proto文件(替换为你的实际文件路径)
    const packageDefinition = protoLoader.loadSync(
      './hello.proto',
      {
        keepCase: true, // 保留proto中的原始命名,避免自动转小驼峰
        longs: String,
        enums: String,
        defaults: true,
        oneofs: true
      }
    );
    
    // 先取hello包,再获取HelloService构造函数
    const HelloService = grpc.loadPackageDefinition(packageDefinition).hello.HelloService;
    const client = new HelloService('grpcb.in:9000', grpc.credentials.createInsecure());
    
  2. 验证proto文件路径
    确保loadSync传入的proto文件路径正确,否则会导致packageDefinition不包含预期的service定义,同样会触发类似错误。

额外说明

  • 如果未设置keepCase: true,proto-loader会默认把HelloService转换成helloService(小驼峰格式),此时你需要用helloService来获取构造函数,否则仍会提示不是构造函数。
  • 可以通过console.log(grpc.loadPackageDefinition(packageDefinition))打印加载结果,查看对象结构,确认service的实际位置和名称。

内容的提问来源于stack exchange,提问作者Vedant Agarwala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:32:41