使用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名称被自动转换(比如小驼峰),引发找不到构造函数的问题。
修复步骤
修正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());验证proto文件路径
确保loadSync传入的proto文件路径正确,否则会导致packageDefinition不包含预期的service定义,同样会触发类似错误。
额外说明
- 如果未设置
keepCase: true,proto-loader会默认把HelloService转换成helloService(小驼峰格式),此时你需要用helloService来获取构造函数,否则仍会提示不是构造函数。 - 可以通过
console.log(grpc.loadPackageDefinition(packageDefinition))打印加载结果,查看对象结构,确认service的实际位置和名称。
内容的提问来源于stack exchange,提问作者Vedant Agarwala
相关产品推荐
相关产品推荐

