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

问题描述 投票:0回答:2

我需要覆盖

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

下的预期是什么
nest fastify nestjs-fastify
2个回答
2
投票

要允许空 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);
  }
);

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

例如,将 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
且正文为空。使用包罗万象的解析器解决了我的问题。


0
投票

我收到错误

FST_ERR_CTP_INVALID_MEDIA_TYPE
,因为我在
application/json
标头中收到带有
Content-Type
且正文为空的 PUT 请求。

我使用自定义挂钩修复了该问题,该挂钩在将请求传递给适配器之前修复了请求。我不知道你的解决方案是否更好,但这对我来说看起来更干净:

    const adapter = nestApp.getHttpAdapter();
    const instance = adapter.getInstance();
    instance.addHook('onRequest', (request, reply, done) => {
        const body = request.body;
        const contentType = request.headers['content-type'];
        const method = request.raw.method;

        if (method === 'PUT' && !body && contentType?.includes('application/json')) {
            delete request.headers['content-type'];
        }

        done();
    });

我受到这个问题的启发:在Fastify addContentTypeParser中使用默认的JSON解析器

© www.soinside.com 2019 - 2024. All rights reserved.