HTTP服务
http 内置模块
Node.js 内置模块 http 用于快速创建 HTTP 服务器
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协议的封装方法。更多功能则通过内置或外部中间件提供。
路由
const express = require('express')
const app = express()
app.get('/', function (req, res) {
res.send('Hello World')
})
app.listen(3000)
中间件
分为内置中间件(无需手动导入),外置中间件(需安装中间件依赖)
使用内置中间件 express.static
启动静态资源服务
app.use(express.static('public'))
app.use(express.static('files'))
使用外置中间件 cookie-parser
解析Cookie标头为键值对
app.use( require('cookie-parser')() )
app.get('/', function (req, res) {
console.log('Cookies: ', req.cookies)
})
koa
koa 也是 express 团队开发的,主要区别在于API风格变化。
koa 是一个中间件框架,只有所有 HTTP 服务器通用的方法才会直接集成进框架代码中,其余部分由中间件实现。
使用koa实现HTTP服务
const Koa = require('koa')
new Koa()
.use((ctx) => {
ctx.body = 'Hello Koa'
})
.listen(9000, () => console.log('listening on 9000'))
koa的主要知识点是其中间件的执行顺序
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 的编程风格。