#23 3 分钟建立 Node.js 网页服务器

今天我们来用 Koa 建立一个简单的网页服务器。

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 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 就会有两种结果:

  • GET 请求到 / 回传 Hello, World!
  • GET 请求到 /about 回传 I am (Koa + Router)!

Koa Static

刚刚说的 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);

其他 Middlewares

Koa 还有很多其他人写的 Middleware 可以实现不同的功能,作为一个架构,Koa 的灵活度非常高。
如何依需求选择不同的 Middleware 或是自己写非常重要。

接下来

应该要进入最後一个部份了:应用程序打包。


每日铁人赛热门 Top 10 (1006)

以 10/06 20:00 ~ 10/07 20:00 文章观看数增加值排名

  1. +212 Day-1 开始玩怀旧游戏机的事前准备导览篇
    • 作者: rei0
    • 系列:在新世代里复活吧!我的童年怀旧游戏机们!
  2. +173 [Day 26] BDD - 组合技
    • 作者: rainforest
    • 系列:Dev's Ops 启程
  3. +171 [Day 24] BDD - godog 小试身手
    • 作者: rainforest
    • 系列:Dev's Ops 启程
  4. +169 [Day 3] SRE - Log写好一点,对团队好一些
    • 作者: rainforest
    • 系列:Dev's Ops 启程
  5. +169 [Day 11] SRE - 事後检讨,拜托拜托让我吸个经验值
    • 作者: rainforest
    • 系列:Dev's Ops 启程
  6. +168 [Day 4] SRE - 保持精简的监控
    • 作者: rainforest
    • 系列:Dev's Ops 启程
  7. +168 [Day 5] SRE - 发动事件左移之术,预视未来的机制
    • 作者: rainforest
    • 系列:Dev's Ops 启程
  8. +166 [Day 10] SRE - ON-CALL
    • 作者: rainforest
    • 系列:Dev's Ops 启程
  9. +163 [Day 25] BDD - godog image封装
    • 作者: rainforest
    • 系列:Dev's Ops 启程
  10. +146 [Day 28] Gitea - 如何自签凭证与Nginx注意
    • 作者: rainforest
    • 系列:Dev's Ops 启程

最近榜上的有很多 DevOps 呢!


<<:  【第二十三天 - XSS Lab(2)-1】

>>:  [Day 22] Crypto 小不舍

D5(9/5)-大同(2371)

注:发文日和截图的日期不一定是同一天,所以价格计算上和当日不同,是很正常的。 买进 大同(2371)...

Day3 - 创建第一个专案

安装完Android Studio 那麽就开始创建我第一个Project吧 开始 我发现我下载的版本...

[13th][Day14] map

移除元素 如果要从切片中移除元素,下面是一个比较简单粗暴的写法 slice := []int{1, ...

未完,待续..........

铁人赛虽然结束了,但更新还会继续,只是不能保证每天都更新了。 通过这次铁人赛,我发现,每天一篇文章,...

Day 4 - Using Argon2 for Salted Password Hashing with ASP.NET Web Forms C# 使用 Argon2 替密码加盐後杂凑加密

=x= 🌵 User Manager - Content Page 替後台管理者密码加盐加密。 密码...