Hapi路由配置:如何将用户ID与Payload收件人ID校验移至routeConfig
如何在Hapi的routeConfig中移入手柄内的ID校验逻辑?
你完全可以实现这个需求!Hapi提供了**pre配置项**,它专门用来定义在handler执行前运行的前置逻辑,非常适合把这类校验从handler里剥离出来,让代码职责更清晰。
具体实现步骤:
把你的ID校验逻辑抽成一个独立的前置函数
这个函数可以访问request对象,完成校验后如果不通过,直接抛出错误(推荐用Hapi的Boom工具生成标准化错误响应,或者自定义返回内容):const checkRecipientNotSelf = async (request, h) => { const userId = Helpers.extractUserId(request); const { recipient } = request.payload; if (recipient === userId) { // 方式1:用Boom生成标准化错误(推荐,符合REST规范) throw Boom.badRequest('_id and recipient id should not match'); // 方式2:自定义你想要的响应格式 // return h.response({ success: false, message: '_id and recipient id should not match' }) // .code(400) // .takeover(); // 调用takeover会终止请求流程,不进入handler } // 校验通过,让请求继续流向handler return h.continue; };在
routeConfig的config中添加pre配置
把刚才的前置函数加到pre数组里(支持多个前置函数按顺序执行):const routeConfig = { method: 'POST', path: '/requestfriend', config: { auth: 'jwt', validate: { payload: { recipient: Joi.string().required().error(new Error('recipient is required')) } }, // 新增pre配置,放入校验逻辑 pre: [ { method: checkRecipientNotSelf } // 如果需要把前置函数的结果传递给handler,可以加assign属性: // { method: checkRecipientNotSelf, assign: 'selfCheckResult' } // 之后在handler里可以通过request.pre.selfCheckResult获取结果 ], handler: async(request, reply) => { // 现在这里只需要处理正常的业务逻辑,不用再做ID校验了 const id = Helpers.extractUserId(request); const payload = request.payload; // 你的业务代码.... } } };
为什么用pre?
- 它和
validate、auth属于同一类请求生命周期钩子,都是在handler执行前运行,符合Hapi的路由设计规范 - 可以让handler只专注于业务逻辑,校验逻辑单独抽离,代码更易维护
- 多个前置函数可以按顺序执行,支持复杂的前置校验组合
内容的提问来源于stack exchange,提问作者Ashish Choudhary
相关产品推荐
相关产品推荐

