Skip to content
导航

HTTP服务

http 内置模块

Node.js 内置模块 http 用于快速创建 HTTP 服务器

js
require('http').createServer((req, res)=>{
  res.end('OK')
}).listen(9000, ()=>console.log('http server listen on port 9000'))

以上代码表示启动一个HTTP服务器,监听9000端口,在收到任何请求时返回字符'OK',响应状态码默认返回200。

响应头非常简单没有足够的信息,浏览器会采用默认的方式展示字符'OK'为网页。

要实现更多功能,就需要开发者根据HTTP协议返回有效信息,浏览器按协议解析信息以正确处理响应内容。

实现HTTP协议上的更多内容,过程中往往有很多常见的、通用的代码,有许多第三方库将这些代码进行封装,使用第三方库能大大简化HTTP服务的开发过程。

express

express 为用户提供全面、快捷的功能封装

express 的基本功能是启动HTTP服务,并提供路由功能、对HTTP协议的封装方法。更多功能则通过内置或外部中间件提供。

路由

js
const express = require('express')
const app = express()

app.get('/', function (req, res) {
  res.send('Hello World')
})

app.listen(3000)

中间件

分为内置中间件(无需手动导入),外置中间件(需安装中间件依赖)

使用内置中间件 express.static 启动静态资源服务

js
app.use(express.static('public'))
app.use(express.static('files'))

使用外置中间件 cookie-parser 解析Cookie标头为键值对

js
app.use( require('cookie-parser')() )
app.get('/', function (req, res) {
  console.log('Cookies: ', req.cookies)
})

koa

koa 也是 express 团队开发的,主要区别在于API风格变化。

koa 是一个中间件框架,只有所有 HTTP 服务器通用的方法才会直接集成进框架代码中,其余部分由中间件实现。

使用koa实现HTTP服务

js
const Koa = require('koa')
new Koa()
    .use((ctx) => {
        ctx.body = 'Hello Koa'
    })
    .listen(9000, () => console.log('listening on 9000'))

koa的主要知识点是其中间件的执行顺序

js
const Koa = require('koa');
new Koa()
  .use(async function (ctx, next) {
    console.log('1')
    await next()
    console.log('1')
  })
  .use(async function (ctx, next) {
    console.log('2')
    await next()
    console.log('2')
  })
  .use(async function (ctx, next) {
    console.log('3')
    await next()
    console.log('3')
  })
  .listen(9000, () => console.log('listening on 9000'))

上述中间件在请求到来时,打印顺序为123321。

形式类似于浏览器中的事件监听的捕获与冒泡:中间件函数代码以await next() 分界,前为捕获,后为冒泡。

fastify

fastify 是一个类似 express 的HTTP服务框架,它的主要特点是在基准测试中领先于测试竞品,比http内置模块还快。

nestjs

nestjs 被称为 Node.js 版的 spring。

Nest 提供了一个开箱即用的应用程序架构,允许开发人员和团队创建高度可测试、可扩展、松散耦合且易于维护的应用程序。该建筑深受Angular的启发。

Nest 底层HTTP框架默认采用 express,也提供了适配器切换为 fastify。

“开箱即用的应用程序架构”就是使用代码模板创建目录结构,提供装饰器来实现类似 Java spring 的编程风格。

参考资料