用 Typescript 写的 Node.js API 造的轮子,一个简单的 Http Framework - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
divasatanica
V2EX    分享创造

用 Typescript 写的 Node.js API 造的轮子,一个简单的 Http Framework

  •  
      divasatanica 2021-10-13 10:47:34 +08:00 2257 次点击
    这是一个创建于 1459 天前的主题,其中的信息可能已经有所发展或是发生改变。

    非推广,分享。

    项目地址: https://github.com/divasatanica/auf

    自己用原生 Node.js API 实现的,没有用到其他第三方库。

    当初听早早聊的时候有分享到一道阿里的面试题:如何实现一个静态资源服务器,由此延伸而来的 Idea,于是就自己动手做了。

    功能还比较简单,也暂时算不上 Framework 吧。

    • 支持自定义异步中间件
    • 支持路由功能
    • 支持 Serve 静态资源
    • TBD

    希望 V 站的大佬可以评价一下代码风格,指点一下看有没有啥问题,或者有什么建议可以分享一下,不喜勿喷。感谢。

    4 条回复    2021-10-19 16:29:40 +08:00
    scyuns
        1
    scyuns  
       2021-10-14 15:10:22 +08:00   1
    已经 star,但是本人不会 ts 也不会 node 只能关注了
    divasatanica
        2
    divasatanica  
    OP
       2021-10-14 16:51:58 +08:00 via iPhone
    @scyuns 谢谢。
    libook
        3
    libook  
       2021-10-19 12:25:47 +08:00   1
    Node 原生 API 写个 Server 已经十分方便了,有时候微服务架构下甚至都不大需要用框架。
    但自己尝试写一个练练手也挺好的。

    我自己用 JS 比较多,既然题主用 TS,看看能否尽可能消除 any ?

    粗略地看了看 router-core:
    HTTP method 目前貌似有九种,我看题主貌似只写了 6 种,HEAD 方法用得其实也不少(我最近就在用),不知道题主具体怎么处理这个方法的呢?
    像 33 行到 55 行这类的重复性代码可以考虑写个工厂,这样仅需在上面 const methods 声明一次,工厂里用 toLowerCase 转一下作为调用名,也不需要再重复写这几个 method 的名称,重构的时候也不需要改很多地方了。
    既然用原生 API 来写,wrapCtxWithQueryOrBody 就不要自己 split 了,Node 有 WHATWG URL API,你可以直接 new URL(请求完整 URL),然后在 URL 对象里拿出 URLSearchParams 即可,本质上类似个 Map,可以直接调用 get 方法传 key 拿 value 。同理遇到 form 格式的 body 也可以用 URLSearchParams 处理。以及这个方法名字叫 wrapCtxWithQueryAndBody 会不会更合适呢?
    IncomingMessage 是个 ReadableStream,HTTP 的 payload ( body )会根据 request 的 Content-Type 不同而不同,比如 form 、text 、json 、xml 这些都是纯文本格式,还会有一些二进制格式,你可以挑几个常用的 Content-Type 来写 parser (比如写成中间件),其余的可以直接提供 Stream 或 buffer 给框架使用者,让他们自己写 parser 来解析。

    HTTP 框架写的时候其实不难,难点主要在于看 HTTP 的协议规范,可以看一下 W3C 和 WHATWG 的规范文档,对照着实现。
    divasatanica
        4
    divasatanica  
    OP
       2021-10-19 16:29:40 +08:00
    @libook

    确实,如果是想做长久的框架开发,对 W3C 和 HTTP 规范的了解是一定要有的,我自己在做这个的时候,当时目标就是先实现出来,对规范这一块还没有很重视,这个可以作为后续的一个方向。 哈哈,有些函数参数类型就是所有的值皆可,像用来储存数据的结构,value 的类型就直接写成 any 了,后面看看能不能再写得严谨点。

    HTTP Method 这一块,当时想的是把基础的先做出来,后续我会把更多的 Method 添加上去。

    感谢你的意见。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5536 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 09:01 PVG 17:01 LAX 02:01 JFK 05:01
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86