【发布时间】:2021-07-19 07:26:07
【问题描述】:
我是 gRPC 的新手,我正在寻找一种在调用服务器函数之前在 gRPC 中捕获请求的方法。这可能也需要响应。换句话说,我试图在请求/响应进行之前操纵它们。
我发现了一个名为interceptor 的功能,但据我了解,此功能仅与gRPC-web 一起提供!
那么我该怎么做呢?拦截器是否仅用于客户端?
例如,我想用某种能力(可能是拦截器)在 gRPC 中记录每个请求,我该怎么做?
server.js
const grpc = require('@grpc/grpc-js');
const PROTO_PATH = './news.proto';
const protoLoader = require('@grpc/proto-loader');
const options = {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
};
var packageDefinition = protoLoader.loadSync(PROTO_PATH, options);
const newsProto = grpc.loadPackageDefinition(packageDefinition);
const server = new grpc.Server();
let news = [
{ id: '1', title: 'Note 1', body: 'Content 1', postImage: 'Post image 1' },
{ id: '2', title: 'Note 2', body: 'Content 2', postImage: 'Post image 2' },
];
server.addService(newsProto.NewsService.service, {
getAllNews: (call, callback) => {
return callback(null, { news });
}
});
server.bindAsync(
'127.0.0.1:50051',
grpc.ServerCredentials.createInsecure(),
(error, port) => {
if (error) {
throw new Error(error);
}
console.log('Server at port:', port);
console.log('Server running at http://127.0.0.1:50051');
server.start();
}
);
client.js
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
const PROTO_PATH = './news.proto';
const options = {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
};
var packageDefinition = protoLoader.loadSync(PROTO_PATH, options);
const NewsService = grpc.loadPackageDefinition(packageDefinition).NewsService;
const client = new NewsService(
'localhost:50051',
grpc.credentials.createInsecure()
);
client.getAllNews({}, (error, news) => {
if (error) throw error
console.log(news);
});
【问题讨论】: