如何使用 Fastify 为 Nest 添加自定义内容类型解析器

How to add custom content type parser for Nest with Fastify

我需要覆盖 application/json 的内容解析器,以便我的应用程序接受空主体。现在它抛出:

{
    "statusCode": 400,
    "code": "FST_ERR_CTP_EMPTY_JSON_BODY",
    "error": "Bad Request",
    "message": "Body cannot be empty when content-type is set to 'application/json'"
}

我正在尝试:

import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify';
import { NestFactory } from '@nestjs/core';

const fastifyAdapter = new FastifyAdapter({
   addContentTypeParser: // what should go here
});

const app = await NestFactory.create<NestFastifyApplication>(AppModule, fastifyAdapter);

但我无法弄清楚 addContentTypeParser

下的预期内容

要允许空 json 正文,您可以添加如下所示的内容正文解析器。这不会抛出 FST_ERR_CTP_EMPTY_JSON_BODY 错误,而是将请求正文设置为 null.

const fastifyAdapter = new FastifyAdapter();

fastifyAdapter.getInstance().addContentTypeParser(
  'application/json',
  { bodyLimit: 0 },
  (_request, _payload, done) => {
    done(null, null);
  }
);

您还可以使用 done 方法的第二个参数将请求正文设置为您想要的任何值。

例如,将 body 设置为空对象,如下所示:

const fastifyAdapter = new FastifyAdapter();

fastifyAdapter.getInstance().addContentTypeParser(
  'application/json',
  { bodyLimit: 0 },
  (_request, _payload, done) => {
    done(null, {});
  }
);


另外,对于那些像我一样遇到 FST_ERR_CTP_INVALID_MEDIA_TYPE 错误的人,为空正文请求添加一个包罗万象的内容类型解析器可以解决这个问题。

const fastifyAdapter = new FastifyAdapter();

fastifyAdapter.getInstance()
  .addContentTypeParser(
    '*',
    { bodyLimit: 0 },
    (_request, _payload, done) => {
      done(null, null);
    }
  );

Tus 客户端默认发送 POST 请求,没有 content-type 和空主体。使用包罗万象的解析器解决了我的问题。