tegg icon indicating copy to clipboard operation
tegg copied to clipboard

[Feature Request] 提供更加简单化请求方法的修饰器

Open Cyberhan123 opened this issue 3 years ago • 11 comments

现在的HTTPMethod 虽然足够满足业务需求,但是不够简练,是否能提供 常用的 Get,Post等方法的修饰器

@Controller('/')
export class HomeController {
  @Get('/')
  async home() {
    return 'Hello tegg!';
  }
}

顺带补充,能否提供修改全局route的前缀 ,类似于在配置文件提供

export default config={
  tegg:{
    root:"/hello"
  }
}

Cyberhan123 avatar Dec 06 '21 05:12 Cyberhan123

@Cyberhan123 可以先提个 RFC 说说自己想要的注解是什么样的。

killagu avatar Dec 06 '21 07:12 killagu

@Cyber​​han123可以先提个RFC告诉自己想要的注解的。

我会在稍后整理出一个PR

Cyberhan123 avatar Dec 07 '21 03:12 Cyberhan123

@killagu 如果你认为这个 https://github.com/eggjs/tegg/pull/19 可行我会补充测试用例和相关文档

Cyberhan123 avatar Dec 07 '21 09:12 Cyberhan123

@Cyberhan123 参数是不是可以更简单,比如只有 @Get() 这样?其他所有参数都是可选的

killagu avatar Dec 13 '21 13:12 killagu

@Cyberhan123 参数是不是可以更简单,比如只有 @Get() 这样?其他所有参数都是可选的

是可以的,我修改了一下。麻烦帮忙review一下看看是不是合理

Cyberhan123 avatar Dec 14 '21 01:12 Cyberhan123

如果默认值都是 / 的话,这个默认值就没什么意义了。使用的地方都需要设置 path

killagu avatar Dec 14 '21 11:12 killagu

如果默认值都是 / 的话,这个默认值就没什么意义了。使用的地方都需要设置 path

请教一下,如果按照nest的实现我测试时候是如果请求 http://localhost:3000/只能命中第一个hander?

@Controller()
class A{
    @Get()
    function GetA(){
    
    }
    @Get()
    function GetB(){
    
    }
}

而你的想法是否是:如果没有可选参数,可以通过函数名来匹配; 即在上面的情况下,如果是GetA那么可以通过http://localhost:3000/GetA来进行请求; 如果是的话,是否要指定,当成员函数名为Index,或者Home的时候将其匹配到/? 如果要是存在@Get('/') 那么这个函数的优先级相比Home或者Index应该要高?

Cyberhan123 avatar Dec 14 '21 15:12 Cyberhan123

HTTP 接口会有不同的风格,比如说 RPC 类型、REST 类型。

可以分两套 api 出来,比如说。

RPC:

import { Controller, POST } from '@eggjs/tegg/http/rpc'

@Controller('/api/v1')
class Hello {
  // POST /api/v1/helloWorld
  @POST()
  helloWorld() 
}

REST:

import { Controller, Create, List, Get } from '@eggjs/tegg/http/rest'

@Controller('/api/v1/fruits')
class Fruit {
  // POST /api/v1/helloWorld
  @Create()
  create() {}

  @List()
  list() {}

  @Get()
  get(id) {}
}

killagu avatar Dec 15 '21 16:12 killagu

个人感觉如果通过包后缀区分不会很清晰,我们是不是应该直接通过Controller区分?就比如普通的Controller,Rest风格的RestController,支持RPC协议的 RPCController,那Rest风格的httpMethod注解应该有哪些估计还需要调研,RPC这里感觉也还有不少问题

Cyberhan123 avatar Dec 16 '21 01:12 Cyberhan123

是的。我们需要一个更完善的 rfc 详细的描述下不同风格的 controller 注解。

killagu avatar Dec 16 '21 02:12 killagu

namespace + controller 可以配合再一起使用。比如说 import { RestController } from '@eggjs/tegg/rest'。通过 namespace 来区分的原因是,每个风格下的注解可能很多,会导致 @eggjs/tegg 这个 namespace 下太多了。

killagu avatar Dec 16 '21 02:12 killagu