Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTP服务 #15

Open
luoway opened this issue Sep 19, 2023 · 0 comments
Open

HTTP服务 #15

luoway opened this issue Sep 19, 2023 · 0 comments

Comments

@luoway
Copy link
Owner

luoway commented Sep 19, 2023

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 的编程风格。

参考资料

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant