midway icon indicating copy to clipboard operation
midway copied to clipboard

需求:Hooks约束函数

Open cereschen opened this issue 4 years ago • 4 comments

现在的hooks写法不是很优雅 说下我发现的几个问题: 1.首先 async全靠自觉 2.get和post的区分太过简单粗暴 3.ctx每次要手动注入很麻烦

基于此 我认为需要一个define函数来约束,顺便提供type定义, 类似于 vite的 defineConfig 这是我自己的简单实现:

function definePost<T extends any[],R extends Promise<any>>(fn:(ctx:{url:string},...args:T)=>R):(...args:T)=>R{
  return (...args)=>{
   return fn({url:'/'},...args)
  }
}
definePost(async (ctx,name:string)=>{
  return  {message:'hello'}
})

cereschen avatar Mar 21 '21 06:03 cereschen

@cereschen 感谢反馈。

关于 1/3 这两个问题,Hooks 目前不会解决这个问题,但业务可以封装函数来你提到的 definePost 方法来使用,这部分我会放在 2.1 版本中考虑。

关于 2,Hooks 自设计之初就希望做成协议无关的,这种“函数式”的调用方式并不仅仅是适用于 HTTP,同样也适用于RPC等。在一体化中,希望可以做到像 SDK 一样调用接口,而不是关心 HTTP 协议的细节。

Lxxyx avatar Mar 22 '21 03:03 Lxxyx

@cereschen 感谢反馈。

关于 1/3 这两个问题,Hooks 目前不会解决这个问题,但业务可以封装函数来你提到的 definePost 方法来使用,这部分我会放在 2.1 版本中考虑。

关于 2,Hooks 自设计之初就希望做成协议无关的,这种“函数式”的调用方式并不仅仅是适用于 HTTP,同样也适用于RPC等。在一体化中,希望可以做到像 SDK 一样调用接口,而不是关心 HTTP 协议的细节。

我明白了您的意思 改变了一下思路 是否可以加入一个编译期的选项 传递一个函数 然后参数传入定义的函数名 根据返回的method来生成最终的请求类型 这样用户可以设计自己的规范 例如:

{
transformMethod(name){
if(name.endsWith('post')){
 return 'post'
}
}
}

这样入侵性比较小 在各种协议之间切换也比较方便

cereschen avatar Mar 22 '21 04:03 cereschen

是否可以加入一个编译期的选项 传递一个函数 然后参数传入定义的函数名 根据返回的method来生成最终的请求类型 这样用户可以设计自己的规范 例如:

有考虑过类似的功能,但这一块的设计还没有确定。目前比较看好的想法是:

import { pipe } from '@midwayjs/hooks'
import { Get, Middleware } from '@midwayjs/decorator'
import { Validate, Auth } from '@midwayjs/validator'

class QueryDTO {
  name: string
}

export default pipe(
  Get(),
  Middleware(logger),
  Validate(QueryDTO),
  Auth('admin'),
  (query: QueryDTO) => {
    const user = useCurrentUser()
    return user.id + query.name
  }
)

通过类似于 Pipe + Decorator 的方式,让用户可以自定义 Method。

Lxxyx avatar Mar 22 '21 05:03 Lxxyx

是否可以加入一个编译期的选项 传递一个函数 然后参数传入定义的函数名 根据返回的method来生成最终的请求类型 这样用户可以设计自己的规范 例如:

有考虑过类似的功能,但这一块的设计还没有确定。目前比较看好的想法是:

import { pipe } from '@midwayjs/hooks'
import { Get, Middleware } from '@midwayjs/decorator'
import { Validate, Auth } from '@midwayjs/validator'

class QueryDTO {
  name: string
}

export default pipe(
  Get(),
  Middleware(logger),
  Validate(QueryDTO),
  Auth('admin'),
  (query: QueryDTO) => {
    const user = useCurrentUser()
    return user.id + query.name
  }
)

通过类似于 Pipe + Decorator 的方式,让用户可以自定义 Method。

这样的设计挺不错 方便封装 利于拓展

cereschen avatar Mar 22 '21 05:03 cereschen