包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
},我天真地试图添加元作为蛇的情况(几乎可以肯定它不会工作,但你知道…试一试)
发布于 2021-02-10 03:30:02
您在此处所做的更改实际上不会切换到新的grpc-js包。它只是尝试将grpc-js中的Metadata类与NestJS内部使用的grpc包一起使用。NestJS需要将其对grpc的依赖更改为@grpc/grpc-js,才能真正进行切换。
https://stackoverflow.com/questions/66104867
复制相似问题