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 的规范文档,对照着实现。