midway
midway copied to clipboard
需求:Hooks约束函数
现在的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 感谢反馈。
关于 1/3 这两个问题,Hooks 目前不会解决这个问题,但业务可以封装函数来你提到的 definePost 方法来使用,这部分我会放在 2.1 版本中考虑。
关于 2,Hooks 自设计之初就希望做成协议无关的,这种“函数式”的调用方式并不仅仅是适用于 HTTP,同样也适用于RPC等。在一体化中,希望可以做到像 SDK 一样调用接口,而不是关心 HTTP 协议的细节。
@cereschen 感谢反馈。
关于 1/3 这两个问题,Hooks 目前不会解决这个问题,但业务可以封装函数来你提到的 definePost 方法来使用,这部分我会放在 2.1 版本中考虑。
关于 2,Hooks 自设计之初就希望做成协议无关的,这种“函数式”的调用方式并不仅仅是适用于 HTTP,同样也适用于RPC等。在一体化中,希望可以做到像 SDK 一样调用接口,而不是关心 HTTP 协议的细节。
我明白了您的意思 改变了一下思路 是否可以加入一个编译期的选项 传递一个函数 然后参数传入定义的函数名 根据返回的method来生成最终的请求类型 这样用户可以设计自己的规范 例如:
{
transformMethod(name){
if(name.endsWith('post')){
return 'post'
}
}
}
这样入侵性比较小 在各种协议之间切换也比较方便
是否可以加入一个编译期的选项 传递一个函数 然后参数传入定义的函数名 根据返回的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。
是否可以加入一个编译期的选项 传递一个函数 然后参数传入定义的函数名 根据返回的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。
这样的设计挺不错 方便封装 利于拓展