Egg: 2.x 路由混乱

Created on 29 Dec 2017  ·  8Comments  ·  Source: eggjs/egg

定义接口路由如下:
GET - /api/users/:id
GET - /api/users/address
GET - /api/users/wallet
问题:请求 /api/users/wallet 或 /api/users/address 时路由识别的时 /api/users/:id,执行的是/api/users/:id对应的controller, 在 1.x中不存在这个问题,升级2.x后出现

router not follow template

Most helpful comment

这是 koa-router 的原因,egg2.0 router 继承 koa-router 0.7.3

测试了一下 koa-router

const Koa = require('koa');
const app = new Koa();

const Router = require('koa-router');
var router = new Router();

router.get('/api/users/:id', (ctx, next) => {
  console.log(1);
});

router.get('/api/users/wallet', (ctx, next) => {
  console.log(2);
});

app.use(router.routes()).use(router.allowedMethods());
app.listen(3000);

请求 /api/users/wallet 输出:

# 1

调换一下位置:

const Koa = require('koa');
const app = new Koa();

const Router = require('koa-router');
var router = new Router();

router.get('/api/users/wallet', (ctx, next) => {
  console.log(2);
});

router.get('/api/users/:id', (ctx, next) => {
  console.log(1);
});

app.use(router.routes()).use(router.allowedMethods());
app.listen(3000);

请求 /api/users/wallet 输出:

# 2

由此可见 koa-router 0.7.3 匹配规则是,无论是否有 Path-Params,以匹配到的第一个为准。

至于要找到根源,需要 egg 1.x 的版本 和 koa-router 的版本对应关系,才好定位真正的变化位置。

当然也建议尽量不要定义这样有歧义的路由。

@drunken005 FYI.

All 8 comments

试了一下,没有复现出来,求复现代码~

是不是把 /api/users/:id 的路由写在前面了?

router.js

module.exports = app => {
  const { router, controller } = app;
  router.get('/', controller.home.index);
  router.get('/api/users/:id', controller.home.a);
  router.get('/api/users/address', controller.home.b);
  router.get('/api/users/wallet', controller.home.c);
};

controller/home.js

'use strict';

const Controller = require('egg').Controller;

class HomeController extends Controller {
  async index() {
    this.ctx.body = 'hi, egg';
  }

  async a() {
    console.log(1);
  }

  async b() {
    console.log(2);
  }

  async c() {
    console.log(3);
  }
}

module.exports = HomeController;

访问 http://localhost:7001/api/users/wallet

输出:

# 1

@drunken005 是这个意思吗?

最好不要写这种有歧义的路由,你可以在 controller 里面判断 id 在调用对应的方法

这是 koa-router 的原因,egg2.0 router 继承 koa-router 0.7.3

测试了一下 koa-router

const Koa = require('koa');
const app = new Koa();

const Router = require('koa-router');
var router = new Router();

router.get('/api/users/:id', (ctx, next) => {
  console.log(1);
});

router.get('/api/users/wallet', (ctx, next) => {
  console.log(2);
});

app.use(router.routes()).use(router.allowedMethods());
app.listen(3000);

请求 /api/users/wallet 输出:

# 1

调换一下位置:

const Koa = require('koa');
const app = new Koa();

const Router = require('koa-router');
var router = new Router();

router.get('/api/users/wallet', (ctx, next) => {
  console.log(2);
});

router.get('/api/users/:id', (ctx, next) => {
  console.log(1);
});

app.use(router.routes()).use(router.allowedMethods());
app.listen(3000);

请求 /api/users/wallet 输出:

# 2

由此可见 koa-router 0.7.3 匹配规则是,无论是否有 Path-Params,以匹配到的第一个为准。

至于要找到根源,需要 egg 1.x 的版本 和 koa-router 的版本对应关系,才好定位真正的变化位置。

当然也建议尽量不要定义这样有歧义的路由。

@drunken005 FYI.

感觉是一个典型的 bug 当做 feature 的案例。

@atian25 请问,像当前用户地址的restful的url怎样写比较好

就他这个案例,通配的放到后面就好了。

Was this page helpful?
0 / 5 - 0 ratings

Related issues

skyyangpeng picture skyyangpeng  ·  3Comments

kylezhang picture kylezhang  ·  3Comments

yuu2lee4 picture yuu2lee4  ·  3Comments

whlsxl picture whlsxl  ·  3Comments

Leungkingman picture Leungkingman  ·  3Comments