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

Go客户端连接TypeScript JSON RPC本地服务器通信故障排查

排查TypeScript JSON RPC服务器与Go客户端stdin/stdout通信问题

一、检查服务器端vscode-jsonrpc的stdin/stdout配置

  • 确认服务器正确绑定process.stdin和process.stdout,vscode-jsonrpc的createMessageConnection需要传入标准IO流:
    import { createMessageConnection, ConsoleLogger, IPCMessageReader, IPCMessageWriter, LogLevel } from 'vscode-jsonrpc/node';
    
    const reader = new IPCMessageReader(process.stdin);
    const writer = new IPCMessageWriter(process.stdout);
    // 临时开启 verbose 日志,排查是否有消息接收记录
    const logger = new ConsoleLogger(LogLevel.Verbose);
    const connection = createMessageConnection(reader, writer, logger);
    
    // 确保testRequest方法注册逻辑无遗漏
    connection.onRequest('testRequest', async (params) => {
      console.log('in test request');
      return { result: 'success' };
    });
    
    connection.listen();
    console.log('listening...');
    
  • 注意:如果自定义了日志级别,需确保不会屏蔽请求相关的日志输出。

二、检查Go客户端jsonrpc2的传输配置

  • 必须使用VSCodeObjectCodec,因为vscode-jsonrpc默认采用VS Code风格的JSON-RPC编码(和标准JSON-RPC存在分隔符等细节差异),用默认JSONCodec会导致消息无法解析:
    package main
    
    import (
      "context"
      "os/exec"
    
      "github.com/sourcegraph/jsonrpc2"
    )
    
    func main() {
      // 启动TypeScript服务器子进程,绑定其stdin/stdout
      cmd := exec.Command("node", "dist/server.js") // 替换为你的服务器启动路径
      stdin, err := cmd.StdinPipe()
      if err != nil {
        panic(err)
      }
      stdout, err := cmd.StdoutPipe()
      if err != nil {
        panic(err)
      }
      if err := cmd.Start(); err != nil {
        panic(err)
      }
    
      // 基于子进程的IO创建JSON-RPC流
      stream := jsonrpc2.NewBufferedStream(jsonrpc2.NewPlainStream(stdout, stdin), jsonrpc2.VSCodeObjectCodec{})
      conn := jsonrpc2.NewConn(context.Background(), stream, nil)
    
      var result map[string]interface{}
      err = conn.Call(context.Background(), "testRequest", nil, &result)
      if err != nil {
        panic(err)
      }
      println("Received result:", result)
    
      cmd.Wait()
    }
    

三、验证缓冲区刷新问题

  • TypeScript端:Node.js的stdout默认缓冲,少量内容可能不会立即发送,可手动调用process.stdout.flush(),或在创建IPCMessageWriter后确认是否自动处理缓冲。
  • Go端:若使用BufferedStream,可尝试在调用Call后手动执行stream.Flush(),确保消息立即发送。

四、验证消息传输完整性

  • 在服务器端临时监听原始数据,确认是否收到客户端请求:
    process.stdin.on('data', (data) => {
      console.log('Raw received data:', data.toString());
    });
    
  • 在Go客户端打印待发送的请求结构,确认符合JSON-RPC规范(包含jsonrpc: "2.0"、id、method字段)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:36:11