Deno Oak框架如何为单个路由链式绑定多个中间件?
Deno Oak 单路由绑定多个链式执行中间件的正确方法
你之前的写法存在两个核心错误,修正后即可正常实现需求:
- 错误1:重复调用
.post()注册同路径同方法路由,Oak 只会匹配第一个注册的同路径同方法处理器,后续重复注册的处理器会被直接忽略,不会执行 - 错误2:第一个中间件使用了 Express 风格的
(req, res)参数,Oak 中间件统一采用类 Koa 的参数规范,不存在分离的 req/res 入参,参数格式错误会导致拿不到正确的上下文对象,这也是你之前合并中间件后报response.render() is not a function的核心诱因之一
正确实现步骤
- 统一所有中间件的参数格式,所有中间件第一个参数为上下文对象
ctx,非末尾的中间件第二个参数为next函数,自身逻辑执行完成后必须调用await next()才能将控制权传递给下一个中间件,否则执行链路会直接中断 - 同一路由的多个中间件,按执行顺序直接作为参数传入同一个
.post()方法即可,不需要重复调用路由方法注册同路径
示例代码:
// 第一个中间件:负责提交数据到数据库 const addProductPanier = async (ctx: any, next: () => Promise<unknown>) => { // 所有请求参数从 ctx.request 上获取,不要使用自定义的req/res入参 // 此处写你的数据库写入逻辑 // 逻辑执行完成必须调用next,才会进入下一个中间件 await next() } // 第二个中间件:负责查询数据并渲染页面 const showPanier = async (ctx: any) => { // 此处写你的数据查询逻辑 // 最后调用ctx.render完成页面渲染 await ctx.render("你的模板文件名", { // 传入渲染所需的数据 }) } // 单路由按顺序传入多个中间件即可按顺序链式执行 router.post("/OBV/panier", addProductPanier, showPanier)
额外排查点
如果调整写法后仍然出现render is not a function报错,请确认:
- 你已经在路由注册前,正确挂载了对应的视图渲染中间件(比如Oak官方适配的视图引擎插件),没有挂载渲染能力时ctx上本身不存在render方法
- 所有对响应的操作都基于ctx对象取值,不要混用其他框架的req/res写法
内容的提问来源于stack exchange,提问作者user19407663
相关产品推荐
相关产品推荐

