替换grpc为@grpc/grpc-js时出现Error:13 INTERNAL: No message received
替换grpc为@grpc/grpc-js时报错:No message received
将原有代码中的grpc包替换为@grpc/grpc-js后出现错误,切回const grpc = require('grpc')即可正常运行,已知两个包理论兼容,不清楚遗漏了哪些配置或操作。
相关代码
const grpc = require("@grpc/grpc-js"); const protoLoader = require("@grpc/proto-loader"); const confiq = require('confiq').default; const PROTO_PATH = __dirname + '/proto'; const { url, port } = confiq('style') const packageDefinition = protoLoader.loadSync( `${PROTO_PATH}/style.proto`, { longs: Number, enums: String, defaults: true, oneofs: true, includeDirs: [ PROTO_PATH ] }); const SERVICE_URL = `${url}:${port}` const StyleProto = grpc.loadPackageDefinition(packageDefinition).com.xxx.style; const grpcCredentials = grpc.credentials.createInsecure(); function call(method, requestData) { const clientStub = new StyleProto.StyleService(SERVICE_URL, grpcCredentials, { 'grpc.max_send_message_length': 10485760, 'grpc.max_receive_message_length': 629145600 }); if (!clientStub[method]) throw new Error('Method not available'); return new Promise((resolve, reject) => { clientStub[method](requestData, (err, data) => { console.log(err) console.log(data) if (err || data.statusResponse.statusType === 'ERROR') reject(err || data); resolve(data); }); }); } module.exports = call;
错误信息
at callErrorFromStatus (xxx/node_modules/@grpc/grpc-js/build/src/call.js:31:19) at Object.onReceiveStatus (xxx/node_modules/@grpc/grpc-js/build/src/client.js:180:80) at Object.onReceiveStatus (xxx/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:360:141) at Object.onReceiveStatus (xxx/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:323:181) at xxx/node_modules/@grpc/grpc-js/build/src/resolving-call.js:94:78 at processTicksAndRejections (internal/process/task_queues.js:77:11) for call at at ServiceClientImpl.makeUnaryRequest xxx/style-service-client/node_modules/@grpc/grpc-js/build/src/client.js:160:32) at ServiceClientImpl.<anonymous> xxx/style-service-client/node_modules/@grpc/grpc-js/build/src/make-client.js:105:19) at Object.<anonymous> xxx/style-service-client/src/adsTest.js:29:12) at Module._compile (internal/modules/cjs/loader.js:1085:14) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10) at Module.load (internal/modules/cjs/loader.js:950:32) at Function.Module._load (internal/modules/cjs/loader.js:790:12) at Function.executeUserEntryPoint [as runMain] (internal/run_main.js:75:12) at internal/main/run_main_module.js:17:47 { code: 13, details: 'No message received', metadata: Metadata { internalRepr: Map(0) {}, options: {} } }
环境信息
- Node版本:v14.20.1
- 依赖包版本:
"@grpc/grpc-js": "^1.8.18", "@grpc/proto-loader": "^0.7.8", "async": "^3.2.4", "confiq": "0.0.3", "grpc": "^1.24.11", "lodash": "^4.17.21"
排查方向与解决建议
移除旧grpc包冲突
项目中同时安装了grpc和@grpc/grpc-js两个包,可能存在加载冲突。执行以下命令卸载旧包:npm uninstall grpc调整客户端配置参数
@grpc/grpc-js的客户端配置参数与旧包有细微差异,尝试优化配置项:const clientStub = new StyleProto.StyleService(SERVICE_URL, grpcCredentials, { 'grpc.max_send_message_length': 10 * 1024 * 1024, 'grpc.max_receive_message_length': 600 * 1024 * 1024, 'grpc.keepalive_time_ms': 30000, 'grpc.keepalive_timeout_ms': 5000 });优化proto加载逻辑
@grpc/grpc-js对proto加载的处理更严格,补充关键配置项避免映射错误:const packageDefinition = protoLoader.loadSync( `${PROTO_PATH}/style.proto`, { longs: Number, enums: String, defaults: true, oneofs: true, includeDirs: [PROTO_PATH], keepCase: true });验证服务端协议兼容性
@grpc/grpc-js基于HTTP/2,需确认旧grpc服务端是否开启了HTTP/2支持。如果服务端也是Node.js编写,建议同步升级到@grpc/grpc-js。完善错误调试信息
在回调中补充完整错误日志,明确问题环节:return new Promise((resolve, reject) => { clientStub[method](requestData, (err, data) => { if (err) { console.error('GRPC调用错误:', err.code, err.details, err.metadata); return reject(err); } console.log('收到响应:', data); if (data.statusResponse?.statusType === 'ERROR') { return reject(data); } resolve(data); }); });
内容的提问来源于stack exchange,提问作者Vaibhav Verma
相关产品推荐
相关产品推荐

