V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
divasatanica
V2EX  ›  分享创造

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

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

    非推广,分享。

    项目地址: 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   ·   实用小工具   ·   2592 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:01 · PVG 13:01 · LAX 21:01 · JFK 00:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.