[英]NestJS GRPC metadata no longer received by server after @grpc/grpc-js update
package grpc
正在貶值,因此我已按照維護人員的建議移至@grpc/grpc-js
。 由於遷移到新的 package 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");
以這種方式構造元數據會產生以下 object
Metadata { internalRepr: Map { 'clientid' => [Array] }, options: {} }
服務器沒有收到設置的元數據
// 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
package 構建元數據時,服務器會正確接收元數據。
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
},
我天真地嘗試將元數據添加為蛇案例(幾乎可以肯定它不起作用,但你知道......必須嘗試)
您在此處所做的更改實際上不會切換到新的 grpc-js package。 它只是嘗試使用來自 grpc-js 的Metadata
class 和 NestJS 內部使用的grpc
package。 NestJS 需要將其對grpc
的依賴更改為@grpc/grpc-js
才能實際切換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.