KOA 每日一问 中间件的执行顺序和定义顺序。
发布于 8 年前 作者 rover5056 6512 次浏览 来自 问答

两个问题。 1.在KOA 里,中间件之间除了执行顺序之外,有参数之间的联系吗。 比如上一个中间件在next 时给下一个中间件传递参数。 还是说不能传参数。 2.现在我在post的请求时取到了参数,然后我准备处理一些数据。但是写到一个func 里感觉不好管理。所以我想把处理的逻辑放在另一个func中。现在问题来了: 必须用另一个另一个generator函数了,直接用普通的func就可以?如果要挂载另一个generator,用router.use还是?从第一个yeild指向新的func时,参数怎么传递 untitled4.png

10 回复

还有一个问题是 next 指向的顺序是 根据use注册的顺序吗(先写先执行?) 还是其他的判断逻辑? 为什么在这里的输出顺序是“00”>“5566”>'01’ use 的逻辑提前在.post之前了?

参数绑定到this上呗

为什么在这里的输出顺序是“00”>“5566”>'01’ ? 回答你这个问题。看源码注释就知道了

/**
 * Use given middleware(s) before route callback.
 *
 * Only runs if any route is matched. If a path is given, the middleware will
 * run for any routes that include that path.
 *
 * @example
 *
 * ```javascript
 * router.use(session(), authorize());
 *
 * // use middleware only with given path
 * router.use('/users', userAuth());
 *
 * app.use(router.routes());
 * ```
 *
 * @param {String=} path
 * @param {Function} middleware
 * @param {Function=} ...
 * @returns {Router}
 */

Router.prototype[method] Router.prototype.use 他们同时调用了 router.register这个方法。你可以看内部实现

@KingTree

如果我想控制它的执行流程。先走post的方法 ,然后再接着执行后面挂载的方法。。该怎么写,求指导

@rover5056 虽然不知道你要做什么。不过通过 中间件 middleware 可以

你需要了解,koa 中间件机制,是剥洋葱的顺序就行了。 -> 3 -> 2 -> 1 -> 0 -> 1 -> 2 ->3

@KingTree 我的意思就是,我怎么样能够定义 router.post 为1. router.use为2.
我怎么样能够知道我定义的中间件是第几个执行。

@rover5056

router.use(function * (next){
	yield next;
	//这里写你想做的事情
});

但是你这样写很怪。路由只做路由的事情,干嘛要做中间件的事情呢?

@KingTree 额 不是用路由做中间件的事,是路由判断完成拿到参数然后怎样控制它继续执行对应的中间件。 比如

router.post(’/’,function*(){ … yield next 1; //执行a方法 ) router.get(’/’,function*(){ … yield next 2; //执行b方法 )

是想指定对应路由之后的对应的方法。。。

@rover5056

中间件是所有请求都会路过的。

服务启动就会加载所有中间件,所以不可能动态加载中间件的。

@rover5056 你只是想路由匹配的时候执行对应的方法吧,加个model层呗,建议你看下狼叔的rest的文章,里面有详细介绍。

回到顶部