今天我们来用 Koa 建立一个简单的网页服务器。
Koa 与 Express 同为 Node.js 的网页服务器 Package。
两个都是非常好的网页服务器,但因为两者出现的时期不同,所以概念上也有点差异。
Express 出现的比较早,当时的 JavaScript 没有好控制的非同步,所以它的架构是线性的。
而 Koa 的时候就有了 Promise,後面更有 async/await,因此,它的架构是洋葱状。
但其实我很少用 Express,所以跟它也不熟。
npm i koa
除了建立专案、初始化专案外,我们只需要写下面这段程序就建构好一个最基础的服务器了。
const Koa = require("koa");
const app = new Koa();
app.use(async (ctx, next) => {
ctx.body = "Hello, World!\n";
ctx.type = "text/plain";
await next(); // 这里没有 Next 也没差,因为只有一个 Middleware
});
app.listen(80);
这样我们的服务器就会跑在 PORT 80 (HTTP) 上面了。
然後它会回传一个简单的 Hello, World!
。
Koa Router 是一个很好用的工具,先用它建立一个路由表後,再让 Koa 照着路由表处理请求。
npm i koa-router
const Koa = require("koa");
const Router = require("koa-router");
const app = new Koa();
const router = new Router();
// 建立路由表的规则
router.get("/", async (ctx, next) => {
ctx.body = "Hello, World!\n";
ctx.type = "text/plain";
await next();
});
router.get("/about", async (ctx, next) => {
ctx.body = "I am (Koa + Router)!\n";
ctx.type = "text/plain";
await next();
});
// 让 Koa 使用我们建立的路由表
app.use(router.routes());
app.listen(80);
这样我们的 Server 就会有两种结果:
Hello, World!
I am (Koa + Router)!
刚刚说的 Router 很适合作为动态产生内容的东西,就跟之前写的 Worker 里面用的 itty-router 很像。
但有时候我们只是要 Serve 一个资料夹内所有的静态档案,我们就可以用 Koa-Static 来帮我们处理。
npm i koa-static
const Koa = require("koa");
const app = new Koa();
app.use(require("koa-static")("dist"));
app.listen(80);
上面这 4 行程序就可以建立一个以 dist 资料夹为根目录的网页服务器了。
或者是只写一行...
(new (require("koa"))()).use(require("koa-static")("dist")).listen(80);
Koa 还有很多其他人写的 Middleware 可以实现不同的功能,作为一个架构,Koa 的灵活度非常高。
如何依需求选择不同的 Middleware 或是自己写非常重要。
应该要进入最後一个部份了:应用程序打包。
以 10/06 20:00 ~ 10/07 20:00 文章观看数增加值排名
+212
Day-1 开始玩怀旧游戏机的事前准备导览篇
+173
[Day 26] BDD - 组合技
+171
[Day 24] BDD - godog 小试身手
+169
[Day 3] SRE - Log写好一点,对团队好一些
+169
[Day 11] SRE - 事後检讨,拜托拜托让我吸个经验值
+168
[Day 4] SRE - 保持精简的监控
+168
[Day 5] SRE - 发动事件左移之术,预视未来的机制
+166
[Day 10] SRE - ON-CALL
+163
[Day 25] BDD - godog image封装
+146
[Day 28] Gitea - 如何自签凭证与Nginx注意
最近榜上的有很多 DevOps 呢!
注:发文日和截图的日期不一定是同一天,所以价格计算上和当日不同,是很正常的。 买进 大同(2371)...
安装完Android Studio 那麽就开始创建我第一个Project吧 开始 我发现我下载的版本...
移除元素 如果要从切片中移除元素,下面是一个比较简单粗暴的写法 slice := []int{1, ...
铁人赛虽然结束了,但更新还会继续,只是不能保证每天都更新了。 通过这次铁人赛,我发现,每天一篇文章,...
=x= 🌵 User Manager - Content Page 替後台管理者密码加盐加密。 密码...