CodeSky 代码之空

随手记录自己的学习过程

koa-router 8 升级迁移手册

2018-05-08 20:28分类: JavaScript评论: 0

在公司内有小伙伴用了 koa-router 8,但是我发现他的用法并不正确,没有注意到 breaking changes。于是翻译一波这个……

如果想要体验一下最新版本,只要 npm install koa-router@next 即可。

更新日志

7.x 中:

1router.use('/nested/path', otherRouter.routes())
2router.use('/users', userAuth());
3

8.x 的变更:

1const router = new Router({prefix: '/nested/path'});
2router.nest('/nested/path', otherRouter);
3
4const router = new Router({prefix: '/users'});
5router.use(userAuth());
6

7.x 中:

1parentRouter.use(childRouter.routes());
2

8.x 的变更:

1parentRouter.nest(childRouter);
2

1// use -> nest
2forums.use(posts.routes());
3

简言之,上面变成了下面这种形式:

1forums.nest(posts);
2

在使用完 .routes() 之后在声明路由将不再适用。你必须在使用 .routes() 之前声明好路由。.routes() 是一个在那个时段的路由的快照。在使用完 .routes 后没有变更将会对上一个 routes() 调度产生影响。

1app.use(router.routes());
2router.post('/some-endpoint', () => {});
3

需要变更为:

1router.post('/some-endpoint', () => {});
2// 必须在 调用 .routes() 前注册路由!
3app.use(router.routes());
4

.use() 不再支持路径前缀。取而代之的,嵌套一个路由。

1const router = new Router();
2router.use('/admin', authenticateAdmin);
3router.get('/secrets', () => {});
4app.use(router.routes());
5

变更为:

const secretsRouter = new Router();
const adminRouter = new Router();
secretsRouter.get('/secrets', () => {});
adminRouter.nest('/admin', secretsRouter);
app.use(adminRouter.routes());

调用 routes() 后对路由进行变更不会影响先前由 routes() 返回的中间件。

当路由嵌套时,仍然可对其进行更改。在路由或者任何祖先上调用 routes() 后,路由的更改将被忽略。


1router.use('*', ...)
2

变更为:

1router.use(...);
2

「按 URL 出现顺序运行参数中间件」变更为根据 param 调用的顺序。


1router.get('users-index', '/users', () => { ... });
2router.url('users-index', {}, { query: { page: 1 } });
3// => /users?page=1
4

变更为:

1router.get('users-index', '/users', () => { ... });
2router.url('users-index', { page: 1 });
3// => /users?page=1
4

重定向命名路由:

旧的页面的 GET 的处理程序因为首先被定义,所以它首先被匹配。在定义重定向时,她其实只是另一个符合匹配的处理程序。重定向你的处理程序,而不是重定向这种方法。

1const router = create()
2    .get('newpage', '/newpage', () => {})
3    .get('oldpage', '/oldpage', () => {})
4    .redirect('oldpage', 'newpage');
5

变更为:

1const router = create()
2    .get('newpage', '/newpage', () => {})
3    .get('oldpage', '/oldpage', (ctx) => ctx.redirect(ctx.router.path('oldpage')));
4

参考资料:

评论 (0)