由于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");
型
以这种方式构造Meta数据将生成以下对象
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
},
型
我天真地试图添加Meta作为snake case(几乎可以肯定它不会工作,但你知道......必须尝试)
3条答案
按热度按时间0mkxixxg1#
我也遇到了同样的问题。所以我把nestjs@7升级到了nestjs@8.。
例如,如果你查看元数据,user-agent是grpc-node/1.24.6它实际上来自grpc包。
guykilcj2#
在客户端。你可以尝试将
add
改为set
元数据。我在两个版本中都能正常工作。示例如下:
字符串
yquaqz183#
这里所做的更改实际上并不会切换到新的grpc-js包。它只是尝试使用grpc-js中的
Metadata
类和NestJS内部使用的grpc
包。NestJS需要将其对grpc
的依赖更改为@grpc/grpc-js
才能真正切换。