我正在编写一个 fastify 应用程序,该应用程序应该侦听 post 请求并捕获请求的原始正文以进行身份验证。由于我进行了广泛的搜索,似乎 fastify 没有内置对此的支持,而且我发现的任何解决方案都不起作用,所以我决定使用 onRequest 钩子,它可以完美地捕获数据,但不知何故有导致关联路径的路由处理程序无法工作的令人痛苦的副作用。我确信我的测试是正确的,因为如果我删除钩子,路由处理程序将再次开始运行,即使我将其添加回来但没有逻辑它也可以工作,但是当我添加数据捕获逻辑时它就会停止。
代码的输出是钩子运行十六进制数据包的日志,然后是完整的原始 json,路由处理程序应该记录其运行的其他内容
fastify.addHook('onRequest', (request, reply, done) => {
console.log('onRequest hook is running');
const rawDataChunks = [];
request.raw.on('data', (chunk) => {
console.log(chunk);
rawDataChunks.push(chunk);
});
request.raw.on('end', () => {
console.log('RAW DATA:', Buffer.concat(rawDataChunks).toString());
request.rawData = Buffer.concat(rawDataChunks).toString();
done();
});
});
//route does not execute
fastify.post('/', (request, reply) => {
console.log('Route handler is running');
});
Fastify 有一个默认的 内容类型解析器,它处理请求正文流并解析它。
由于您的
onRequest
钩子消耗了请求正文流,因此解析器会失败并卡住。
仅用于测试,您可以禁用任何内容解析器,您的代码将正常工作:
fastify.removeAllContentTypeParsers();
(请注意,删除任何内容类型解析可能不是最好的解决方案,但它可以帮助您理解请求流程)