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

2021-10-13 10:47:34 +08:00
 divasatanica

非推广,分享。

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

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

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

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

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

1789 次点击
所在节点    分享创造
4 条回复
scyuns
2021-10-14 15:10:22 +08:00
已经 star,但是本人不会 ts 也不会 node 只能关注了
divasatanica
2021-10-14 16:51:58 +08:00
@scyuns 谢谢。
libook
2021-10-19 12:25:47 +08:00
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
2021-10-19 16:29:40 +08:00
@libook

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

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

感谢你的意见。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/807487

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX