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

替换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"

排查方向与解决建议

  1. 移除旧grpc包冲突
    项目中同时安装了grpc和@grpc/grpc-js两个包,可能存在加载冲突。执行以下命令卸载旧包:

    npm uninstall grpc
    
  2. 调整客户端配置参数
    @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
    });
    
  3. 优化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
        });
    
  4. 验证服务端协议兼容性
    @grpc/grpc-js基于HTTP/2,需确认旧grpc服务端是否开启了HTTP/2支持。如果服务端也是Node.js编写,建议同步升级到@grpc/grpc-js。

  5. 完善错误调试信息
    在回调中补充完整错误日志,明确问题环节:

    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:17:03