我需要覆盖
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);
}
);
您还可以使用 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
且正文为空。使用包罗万象的解析器解决了我的问题。
我收到错误
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解析器