Node.js/TS中如何保存gRPC回调响应并正确返回?
解决gRPC异步响应的返回问题
你这段代码的核心问题是gRPC调用是异步的:grpc_client.read的回调函数要等请求完成后才会执行,但你现在的函数是同步return,这时候回调里的response还没生成,最后一行的response甚至未定义,必然报错。另外回调里throw的错误也无法被外部捕获,因为异步上下文的异常不会冒泡到同步函数中。
修改方案:用Promise包装异步调用+async/await获取结果
通过Promise把gRPC的异步逻辑包裹起来,再用async/await语法来获取最终结果,就能正确保存并返回回调中的响应:
// 将函数改为返回Promise<string> function read(path: string): Promise<string> { logger.info(`reading ${path}`); const request: FileRequest = new FileRequest(); request.setPath(path); // 用Promise封装gRPC异步调用 return new Promise((resolve, reject) => { grpc_client.read(request, (error: ServiceError | null, response: FileResponse) => { if (error !== null) { // 错误时通过reject抛出,外部可捕获 reject(new Error(`reading failed, error message : ${error.message}`)); return; } // 成功时把响应内容通过resolve返回 resolve(response.getContent_asB64()); }); }); } // 调用read函数时,需要用async/await处理异步结果 async function handleRead() { try { const fileContent = await read("/example/path"); // 在这里处理拿到的文件内容 console.log(fileContent); } catch (err) { // 捕获并处理gRPC调用的错误 console.error(err); } }
关键改动说明:
- 把
read函数的返回类型从string改为Promise<string>:异步操作无法直接返回同步值,必须通过Promise传递结果 - 用
new Promise包裹gRPC调用:在回调中通过resolve传递成功结果,reject传递错误信息 - 调用时必须用
async/await或.then():Promise是异步的,只有这种方式才能正确获取到回调中的响应值
内容的提问来源于stack exchange,提问作者缙云烧饼
相关产品推荐
相关产品推荐

