推荐答案
在 Fastify 中,onSend 钩子用于在响应发送给客户端之前对响应进行处理。你可以通过 onSend 钩子修改响应体、添加自定义头信息或执行其他操作。以下是一个使用 onSend 钩子的示例:
// www.javascriptcn.com code example
fastify.addHook('onSend', (request, reply, payload, done) => {
// 修改响应体
const modifiedPayload = { ...JSON.parse(payload), additionalInfo: 'This is added by onSend hook' };
// 添加自定义头信息
reply.header('X-Custom-Header', 'Custom Value');
// 返回修改后的响应体
done(null, JSON.stringify(modifiedPayload));
});在这个示例中,onSend 钩子会在响应发送之前被调用。你可以通过 payload 参数访问原始的响应体,并通过 done 函数返回修改后的响应体。
本题详细解读
1. onSend 钩子的作用
onSend 钩子允许你在 Fastify 发送响应给客户端之前对响应进行处理。这个钩子非常适合用于以下场景:
- 修改响应体内容
- 添加或修改响应头
- 记录日志或执行其他与响应相关的操作
2. onSend 钩子的参数
onSend 钩子接收四个参数:
request: 当前的请求对象。reply: 当前的响应对象。payload: 原始的响应体内容。done: 一个回调函数,用于返回处理后的响应体或错误。
3. 使用 done 回调函数
done 回调函数用于返回处理后的响应体或错误。它的签名如下:
done(err: Error | null, payload: string | Buffer | Stream | null)
- 如果
err不为null,Fastify 会将错误传递给错误处理中间件。 - 如果
payload不为null,Fastify 会将其作为响应体发送给客户端。
4. 示例代码解析
在示例代码中,我们首先解析了原始的响应体 payload,然后添加了一个新的字段 additionalInfo。接着,我们通过 reply.header 方法添加了一个自定义的响应头 X-Custom-Header。最后,我们使用 done 回调函数返回修改后的响应体。
5. 注意事项
onSend钩子会在每次响应发送之前被调用,因此要确保钩子中的操作不会对性能产生显著影响。- 如果响应体是流或缓冲区,
payload将是一个流或缓冲区对象,而不是字符串。在这种情况下,你需要根据实际情况处理payload。
通过 onSend 钩子,你可以灵活地控制 Fastify 的响应行为,满足各种定制化需求。