NestJS调用Python gRPC服务时pdf_url参数无法正常传递问题排查
NestJS调用Python gRPC服务时pdf_url参数无法正常传递问题排查
我帮你排查了下代码,发现核心问题出在NestJS调用gRPC服务时的参数格式错误,下面具体分析和解决:
问题根源
看你pdf.service.ts里的调用代码:
this.grpcService.FindWhitestSpace(`{pdf_url:plop}`).subscribe(...)
这里你传递的是一个字符串,而不是符合.proto定义的PDFRequest对象。gRPC客户端会把这个字符串直接作为请求体序列化,导致Python服务端接收到的request.pdf_url字段为空(因为字符串无法解析成包含pdf_url属性的结构体)。
而你用grpcurl测试时传递的是标准JSON对象:
grpcurl -plaintext -d '{"pdf_url": "https://example.com"}' ...
这种格式能被gRPC正确解析,所以Python服务能正常拿到参数。
修正步骤
1. 修正参数传递格式
把字符串参数改成对象格式,直接传入包含pdf_url属性的对象:
// 替换原来的字符串参数,用方法接收的pdf_url变量 this.grpcService.FindWhitestSpace({ pdf_url }).subscribe( (response) => { console.log('Response received:', response); resolve(response.whitespaces); }, (error) => { console.error('gRPC error:', error); reject(error); }, );
这里用ES6的对象简写语法{ pdf_url }等价于{ pdf_url: pdf_url },正好匹配.proto里定义的PDFRequest结构。
2. 修正类型定义(可选但推荐)
你的GRPCPdfService接口里,FindWhitestSpace的参数类型定义成了string,这和实际需要的对象类型不符,建议修正:
// 先定义请求体的类型 interface PDFRequest { pdf_url: string; } interface GRPCPdfService { FindWhitestSpace(data: PDFRequest): Observable<WhitespaceResponse>; }
这样TypeScript会帮你做类型校验,避免类似的格式错误。
验证
修正后再调用接口,Python服务端应该能正常打印出Received URL: [你的pdf链接],和grpcurl测试的效果一致。
备注:内容来源于stack exchange,提问作者Joachim DARMALINGON
相关产品推荐
相关产品推荐

