【发布时间】:2021-02-08 15:49:52
【问题描述】:
grpc 包正在贬值,因此我已按照维护人员的建议移至@grpc/grpc-js。由于移至新包 NestJs 不再接收 ExecutionContext 中的元数据,因此以下代码在切换之前一直运行良好。
服务器像这样使用@grpc/grpc-js:
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
import { Metadata, status } from '@grpc/grpc-js';
import { RpcException } from '@nestjs/microservices';
export interface IUserDecorator {
clientId: string;
}
export const User = createParamDecorator(
(data, context: ExecutionContext): IUserDecorator => {
const metadata = context.switchToRpc().getContext() as Metadata;
const { clientid } = metadata.getMap();
if (!clientid) {
throw new RpcException({
code: status.UNAUTHENTICATED,
message: 'clientId is required',
});
}
return {
clientId: clientid.toString(),
};
},
);
客户端像这样构造元数据:
import * as GRPC from '@grpc/grpc-js';
const meta = new GRPC.Metadata();
meta.add("clientId", "dasd");
以这种方式构造元数据会产生以下对象
Metadata { internalRepr: Map { 'clientid' => [Array] }, options: {} }
服务器没有收到设置的meta
// console.log context.switchToRpc().getContext()
{
"_internal_repr": {
"user-agent": [
"grpc-node/1.24.4 grpc-c/8.0.0 (osx; chttp2; ganges)"
]
},
"flags": 0
},
但是,当我使用旧的 grpc 包构建元数据时,服务器会正确接收元数据。
import { Metadata } from 'grpc'
const goodMets = new Metadata();
goodMets.add('clientId', 'dasd');
生产
Metadata { _internal_repr: { clientid: [Array] }, flags: 0 }
服务器接收
{
"_internal_repr": {
"clientid": [
"dasd"
],
"user-agent": [
"grpc-node/1.24.4 grpc-c/8.0.0 (osx; chttp2; ganges)"
]
},
"flags": 0
},
我天真地尝试将元数据添加为蛇案例(几乎可以肯定它不会起作用,但你知道......必须尝试)
【问题讨论】:
-
你好,你能解决这个问题吗?