推荐答案
在 Fastify 中,可以使用 addHook 方法注册钩子。addHook 方法允许你在请求生命周期的不同阶段插入自定义逻辑。以下是一个简单的示例:
// www.javascriptcn.com code example
const fastify = require('fastify')({ logger: true });
// 注册一个前置钩子,在请求处理之前执行
fastify.addHook('onRequest', (request, reply, done) => {
console.log('Request received');
done();
});
// 注册一个后置钩子,在响应发送之前执行
fastify.addHook('onSend', (request, reply, payload, done) => {
console.log('Response is about to be sent');
done();
});
fastify.get('/', async (request, reply) => {
return { hello: 'world' };
});
fastify.listen(3000, (err) => {
if (err) {
fastify.log.error(err);
process.exit(1);
}
console.log('Server is running on http://localhost:3000');
});本题详细解读
1. addHook 方法概述
addHook 是 Fastify 提供的一个方法,用于在请求生命周期的不同阶段注册钩子。钩子允许你在请求处理的不同阶段插入自定义逻辑,例如日志记录、请求验证、响应修改等。
2. 钩子的类型
Fastify 支持多种类型的钩子,常见的包括:
- onRequest: 在请求到达时触发,通常用于日志记录或请求验证。
- preHandler: 在路由处理函数执行之前触发,通常用于权限检查或数据预处理。
- onSend: 在响应发送之前触发,通常用于修改响应内容或记录日志。
- onResponse: 在响应发送之后触发,通常用于记录响应时间或清理资源。
3. 钩子的参数
每个钩子函数接收不同的参数,具体取决于钩子的类型。例如:
- onRequest: 接收
request和reply对象,以及一个done回调函数。 - onSend: 接收
request、reply、payload和done回调函数。
4. 钩子的执行顺序
钩子的执行顺序与注册顺序一致。例如,如果你注册了多个 onRequest 钩子,它们将按照注册的顺序依次执行。
5. 异步钩子
Fastify 支持异步钩子,你可以使用 async/await 或返回一个 Promise。例如:
fastify.addHook('onRequest', async (request, reply) => {
await someAsyncOperation();
console.log('Async hook executed');
});6. 钩子的错误处理
如果钩子中发生错误,你可以通过调用 done(err) 或抛出异常来中断请求处理流程。Fastify 会自动捕获错误并返回适当的响应。
fastify.addHook('onRequest', (request, reply, done) => {
if (!request.headers['authorization']) {
done(new Error('Unauthorized'));
} else {
done();
}
});通过 addHook 方法,你可以灵活地在 Fastify 应用中插入自定义逻辑,从而增强应用的功能和可维护性。