koa如何动态调用控制器
可能一直习惯了php的框架或者其他的MVC框架,最近在研究node的koa框架,于是,想根据请求的url动态调用控制器,然后我使用了koa-router中间件,根据解析url去动态调用对应的controller文件,然后不幸的事情就发生了...
先展示下问题所在:
app.js里router中间件主要调用部分:
var router = require('koa-router');
app.use(router(app));
app.use(function* (next){
if(typeof this.path === 'undefined')
yield next;
var appRouter = require('./router/index');
appRouter.appRouter(app, this.path);
})
在访问服务器的每次打开不同的url地址时,第一次打开时会报404,然后刷新次url地址会正常方法(如果切换其它链接再切换回来,神奇的404再一次发生了),对应的控制器方法也会重新执行一遍,但是roter似乎只有第一次访问时才执行。不知道如何处理,请各位指点一二,先谢过大家。
项目代码已上传到github:https://github.com/iepngs/koa
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
简述:
环境:node: v6.1.0 (这个应该不影响)
在当前环境和代码下,代码的执行与预期一致。(如果node版本影响,请提供你的版本号)
提交了一个pr,解决了第一次访问404的问题。
详细回答
情况
上图
情况是:第一次加载/index/index 和 /index/showbug都报404,之后的访问是200。
并不存在
的情况。
过程分析
挂载路由的方法是:
/index/index 和 /index/showbug 是两次不同的挂载。
所以应该是有且仅有两次404出现的情况。
情况与分析一致。
更多
顺手解决了第一次访问404的问题。
不是完美解决,我并没有传递next参数进去,也就是你的controller不能够访问next。
原回答
我有去题主的github代码,本人使用koa@2半年时间。
首先如果是真心想使用koa的话,建议抛掉套路,看看文档,可以很快上手。
如果是想研究koa这个框架,建议结合着koa源码阅读一起进行。
koa与express不同,它不带router,这也是为什么题主需要引入koa-router。但是恕我直言,题主你完全没有阅读koa-router的文档就进行开发了吧……?对比下题主对koa-router的使用和koa-router文档。koa@1好像也没有get方法,都说它不管router咯。
如果要实现对一个http请求的原生控制,建议不适用koa-router,直接在app.use()里放一个function就好,然后自己实现路由解析,controller的缓存等。你不可能在未阅读koa-router的源码的情况下,就意淫它会按照你的想法走。就是阅读了,你也得想办法研究其路由列表,研究怎么hack进去让它能匹配你最新放进去的路由处理函数。
总结: 题主对koa和koa-router的使用是错误的。建议阅读文档和源码。