Fastify技术问询:如何从Hook获取返回值并向请求处理器传参
Fastify中Hook返回值传递与请求处理器参数获取方案
核心思路
Fastify的请求对象(req)在整个请求生命周期内是同一个实例,所以可以通过在Hook/验证函数中给req添加自定义属性,实现数据从Hook到请求处理器的传递。
1. 在BasicAuth验证函数中挂载用户信息
修改validate函数,当验证通过时,将需要传递的username挂载到req的自定义属性上:
function validate (username, password, req, reply, done) { if (username === 'Tyrion' && password === 'wine') { // 将username挂载到req的自定义属性,供后续处理器使用 req.authUser = { username } done() } else { done(new Error('Winter is coming')) } }
2. 在请求处理器中获取传递的参数
在路由的请求处理器里,直接访问req上的自定义属性即可拿到Hook中传递的username:
fastify.get('/', (req, reply) => { // 从req中获取验证通过的username return { greeting: `Welcome, ${req.authUser.username}!` } })
完整示例代码
const fastify = require('fastify')() const authenticate = { realm: 'Westeros' } fastify.register(require('@fastify/basic-auth'), { validate, authenticate }) function validate (username, password, req, reply, done) { if (username === 'Tyrion' && password === 'wine') { req.authUser = { username } done() } else { done(new Error('Winter is coming')) } } fastify.after(() => { fastify.addHook('onRequest', fastify.basicAuth) fastify.get('/', (req, reply) => { return { greeting: `Welcome, ${req.authUser.username}!` } }) }) fastify.listen({ port: 3000 }, (err) => { if (err) throw err console.log('Server running on http://localhost:3000') })
额外说明
- 自定义属性命名建议避开Fastify内置属性(比如不要用
req.user,部分插件可能会占用该字段),用authUser这类明确的前缀 - 如果使用异步验证逻辑,写法更简洁:
async function validate (username, password, req) { if (username !== 'Tyrion' || password !== 'wine') { throw new Error('Winter is coming') } req.authUser = { username } }
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

