You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:11:04