【问题标题】:NestJS GRPC metadata no longer received by server after @grpc/grpc-js update@grpc/grpc-js 更新后服务器不再接收 NestJS GRPC 元数据
【发布时间】:2021-02-08 15:49:52
【问题描述】:

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
    },

我天真地尝试将元数据添加为蛇案例(几乎可以肯定它不会起作用,但你知道......必须尝试)

【问题讨论】:

  • 你好,你能解决这个问题吗?

标签: node.js nestjs grpc


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2022-11-25
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    相关资源
    最近更新 更多