推荐答案
在 Fastify 中,onRequest 钩子用于在请求处理流程的最开始阶段执行自定义逻辑。你可以在路由级别或全局级别注册 onRequest 钩子。以下是一个示例:
fastify.addHook('onRequest', async (request, reply) => {
console.log('Request received:', request.method, request.url);
// 可以在这里执行一些预处理逻辑
});你还可以在路由级别使用 onRequest 钩子:
// www.javascriptcn.com code example
fastify.route({
method: 'GET',
url: '/example',
onRequest: async (request, reply) => {
console.log('Route-specific onRequest hook');
},
handler: async (request, reply) => {
return { message: 'Hello, Fastify!' };
}
});本题详细解读
1. onRequest 钩子的作用
onRequest 钩子是 Fastify 生命周期钩子之一,它在请求到达服务器后立即执行,但在路由匹配之前。因此,它非常适合用于执行一些全局的预处理逻辑,例如日志记录、请求验证、身份验证等。
2. 全局 onRequest 钩子
全局 onRequest 钩子适用于所有请求。你可以通过 fastify.addHook 方法来注册全局钩子。例如:
fastify.addHook('onRequest', async (request, reply) => {
console.log('Global onRequest hook triggered');
});3. 路由级别 onRequest 钩子
如果你只想在特定路由上执行 onRequest 钩子,可以在定义路由时直接添加 onRequest 钩子。例如:
// www.javascriptcn.com code example
fastify.route({
method: 'GET',
url: '/example',
onRequest: async (request, reply) => {
console.log('Route-specific onRequest hook triggered');
},
handler: async (request, reply) => {
return { message: 'Hello, Fastify!' };
}
});4. 异步处理
onRequest 钩子支持异步操作。你可以在钩子中使用 async/await 来处理异步任务,例如从数据库中获取数据或调用外部 API。
5. 钩子的执行顺序
在 Fastify 中,钩子的执行顺序非常重要。onRequest 钩子是在请求处理流程的最开始阶段执行的,因此在它之后的其他钩子(如 preHandler)会依次执行。
6. 错误处理
如果在 onRequest 钩子中抛出错误,Fastify 会立即停止处理请求,并返回一个错误响应。你可以通过 reply.send 或 reply.code 来定制错误响应。
fastify.addHook('onRequest', async (request, reply) => {
if (!request.headers['authorization']) {
reply.code(401).send({ error: 'Unauthorized' });
}
});通过以上方式,你可以在 Fastify 中灵活使用 onRequest 钩子来处理请求的预处理逻辑。