I was trying to add gRPC to a react-native project. I use envoy which is listening on port 8080 to proxy requests to the node server running on port 4000. However, I get this error message “Http response at 400 or 500 level”. I use the same envoy.yaml config for another React project and it works perfectly. What’s wrong with my configuration here? Can anyone help plz?
envoy.yaml
static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
'@type': type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
codec_type: auto
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ['*']
routes:
- match: { prefix: '/' }
route:
cluster: piement_service
timeout: 0s
max_stream_duration:
grpc_timeout_header_max: 0s
cors:
allow_origin_string_match:
- prefix: '*'
allow_methods: GET, PUT, DELETE, POST, OPTIONS
allow_headers: keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,custom-header-1,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout
max_age: '1728000'
expose_headers: custom-header-1,grpc-status,grpc-message
http_filters:
- name: envoy.filters.http.grpc_web
typed_config:
'@type': type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb
- name: envoy.filters.http.cors
typed_config:
'@type': type.googleapis.com/envoy.extensions.filters.http.cors.v3.Cors
- name: envoy.filters.http.router
typed_config:
'@type': type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
clusters:
- name: piement_service
connect_timeout: 0.25s
type: logical_dns
http2_protocol_options: {}
lb_policy: round_robin
load_assignment:
cluster_name: piement_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 0.0.0.0
port_value: 4000
server.js
const path = require("path");
require("dotenv").config({
path: path.resolve(__dirname, ".env"),
});
const express = require("express");
const app = express();
const port = 4000;
const { signIn, signUp, forgetPassword } = require("./controller/authHandler");
const grpc = require("grpc");
const protoLoader = require("@grpc/proto-loader");
app.use(express.static("public"));
app.use(express.json());
const AUTH_PROTO_PATH = __dirname + "/proto/auth.proto";
const SERVER_URI = "0.0.0.0:8080";
const packageDefinition = protoLoader.loadSync(AUTH_PROTO_PATH);
const protoDescriptor = grpc.loadPackageDefinition(packageDefinition);
const server = new grpc.Server();
server.addService(protoDescriptor.AuthService.service, {
signIn,
signUp,
forgetPassword,
});
server.bind(SERVER_URI, grpc.ServerCredentials.createInsecure());
console.log(server);
server.start();
app.listen(port, () => console.log(`Node server listening on port ${port}!`));