React里调用gRPC接口为啥一直连不上后端?
我用React写了个前端页面,想通过gRPC调用后端服务,但每次请求都失败,浏览器控制台报错说连接被拒绝。后端确认已经启动了gRPC服务,并且用其他客户端测试是通的。
我试过用@grpc/grpc-js在React里直接调用,但好像浏览器不支持原生gRPC?是不是得用gRPC-Web?下面是我现在写的代码:
import { GreeterClient } from './generated/helloworld_grpc_web_pb';
import { HelloRequest } from './generated/helloworld_pb';
const client = new GreeterClient('http://localhost:8080');
const request = new HelloRequest();
request.setName('world');
client.sayHello(request, {}, (err, response) => {
if (err) console.error(err);
else console.log(response.getMessage());
});
是不是哪里配置错了?还是说必须配合Envoy代理才能跑起来?
gRPC-web的库,这没错。但是连接地址可能有问题,通常是http协议不够,你需要用http2或者通过代理。代码给你,可以试试通过 Envoy 代理来转发请求:
1. 安装 Envoy。
2. 配置 Envoy,下面是个简单的配置文件示例 envoy.yaml:
3. 启动 Envoy:
4. 修改你的前端代码连接地址为 Envoy 的监听地址:
这样应该能解决连接被拒绝的问题。希望这能帮到你。
首先,确认你的后端服务是否配置了正确的 CORS 设置,或者使用了一个反向代理(比如 Envoy 或 Nginx)来处理 gRPC-Web 请求。直接在浏览器里调 gRPC-Web 时,后端需要能够理解并处理这种特殊的请求格式。
其次,检查你的服务地址。gRPC-Web 通常使用 HTTP/2 over HTTP(即普通的 HTTP 协议),而不是 gRPC 默认的 HTTP/2。所以确保你的地址协议是
http://或https://,而不是grpc://或grpcs://。最后,确保你的后端服务正确地配置了 gRPC-Web 插件或中间件,以便能够处理来自前端的 gRPC-Web 请求。
简单来说,你可能需要一个反向代理来桥接前端和后端之间的通信。这里有一个简单的 Nginx 配置示例,帮助你快速搭建一个:
pre class="pure-highlightjs line-numbers">
server {
listen 8080;
location / {
grpc_pass grpc://localhost:50051;
}
location /your-grpc-service-path/ {
grpc_web_enable on;
grpc_set_header Content-Type application/grpc-web+proto;
grpc_pass grpc://localhost:50051;
}
}
这个配置假设你的 gRPC 后端运行在
localhost:50051上。你需要根据实际情况调整监听端口和 grpc_pass 的地址。另外,确保你的 React 应用里的请求路径和后端提供的服务路径匹配。
希望这些信息能帮到你,调试这些问题有时候确实挺烦人的。