簡體   English   中英

@grpc/grpc-js 更新后服務器不再接收 NestJS GRPC 元數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM