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
相关产品推荐
相关产品推荐

