NodeJS @grpc/grpc-js更新后,服务器不再接收NestJS GRPC元数据

oxcyiej7  于 2023-11-17  发布在  Node.js
关注(0)|答案(3)|浏览(201)

由于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(几乎可以肯定它不会工作,但你知道......必须尝试)

0mkxixxg

0mkxixxg1#

我也遇到了同样的问题。所以我把nestjs@7升级到了nestjs@8.
例如,如果你查看元数据,user-agent是grpc-node/1.24.6它实际上来自grpc包。

guykilcj

guykilcj2#

在客户端。你可以尝试将add改为set元数据。我在两个版本中都能正常工作。
示例如下:

import * as GRPC from '@grpc/grpc-js';

const meta = new GRPC.Metadata();
meta.set("clientId", "dasd");

字符串

yquaqz18

yquaqz183#

这里所做的更改实际上并不会切换到新的grpc-js包。它只是尝试使用grpc-js中的Metadata类和NestJS内部使用的grpc包。NestJS需要将其对grpc的依赖更改为@grpc/grpc-js才能真正切换。

相关问题