node介绍
它是一个平台,提供JS的一个运行环境
特性
异步、无阻塞IO(input/output 输入输出流)
NodeJS可以轻松实现高并发
Nodejs的基本应用
经常用于webService(前端接口服务器 -- 只负责简单业务,不会涉及业务服务器),因为Nodejs不善于多线程(Nodejs也可以实现多线程)
Express 企业级框架 -> Nestjs 是一个标准的MVC开发框架(TS -> Typescript),国外多用
Koa 洋葱圈框架 -> eggjs 主要开发应对高并发
实现一个简单得后台
1、Express框架实现后端接口
nodejs服务端的一个企业级开发框架,它集成了很多的功能,包括请求处理,服务监听等功能
实现一个用户管理系统:(3个前端、5个后端--开始的一个月,一个多前端、两个后端后边四、五个月)
mkdir user-system
cd user-system
npm init -y
code .
修改package.json -> scripts、author、description、version等
添加一个README.md
新建主文件 -- index.js(index文件往往是代表项目的入口,默认文件)/main.js(主要文件)
安装框架:cnpm i -S express@4
cnpm 淘宝提供的一个中国镜像(把外国的资源同步到中国,然后使用者从中国下载资源)
安装cnpm:npm install cnpm -g --registry=https://registry.nlark.com
i install的简写
-S(不是小写s)是 --save的简写 指把依赖安装到项目依赖中
-D是 --save-dev的简写,把依赖安装到开发依赖中
开发好的接口需要使用接口测试工具进行测试
安装一个postman工具
需要安装一个热更新的工具库
cnpm i -g supervisor
1、Express框架实现静态服务器
11、定义一个静态文件夹,用于放置全部的静态文件 -- static、public
21、因为index是一个模块默认文件,所以需要在文件夹中定义一个index.html文件
/**
* @author looveyy
* @time 2022-03-28 14:30PM
* @description 用户管理系统的主入口文件
* 这样的注释在JS中称为JSDoc
*/
// 引入框架
const express = require('express')
// function express(): core.Express
// express它是一个方法,执行以后会得到一个Express实例(应该是一个框架实例--具备服务器的功能)
const app = express() // app => application(应用)缩写
// 需要给app实例对象添加静态服务中间件
// use(...handlers: RequestHandler[])
// static(root: string)
// root: string => 静态文件夹的根目录
// TypeError: app.use() requires a middleware function
// use方法必须传递一个中间件函数
app.use(express.static('static'))
// 监听一个端口以便启动一个服务
// listen(port: number, callback?: () => void)
app.listen(80, () => {
console.log('>>>>>>>>>>>>>>>>>>>>>>>>> 服务器已启动')
})
// 开发接口 -- 通过前边的代码已经确认:协议--http、ip--127.0.0.1/localhost、端口--80;
// 所以还差地址(接口名字--一般以/xxx/xxx/xx),还需要指定接口的请求方法post/get
// get(path: Route, ...handlers: RequestHandler[])
// get方法需要n个参数
// path: Route => 第一个参数的名字为路由类型的path(地址)
// ...handlers: RequestHandler[] => 接口处理器 -> 需要编写业务处理 -> 接收参数,还需要响应前端 -> 推出:RequestHandler是一个函数,这个函数会接收两个参数
// 如果这个接口需要检查header中的一个自有参数(test-name),如果没有带上,那么业务处理方法就不需要执行
// handler有一个好听的名字--中间件--middleware
function handler(req, res, next) {
console.log('------------------------ 业务拦截方法')
console.log()
if (!req.headers['test-name']) {
res.send({code: 400, message: '你的请求头中不包含需要的参数'})
} else {
// 告诉程序需要执行下一个业务处理器 -> 因为一个函数形参,所以需要执行
next()
}
}
// RequestHandler(req: Request, res: Response, next: NextFunction): void
// next: NextFunction => 下一个业务函数
app.get('/user/info', handler, (req, res) => {
// 接收get参数,get参数是在url上,也称为url的查询参数
// 所以在req对象上应该有一个query对象用于接收参数,并且这个参数是一个json对象
// query: qs.ParsedQs(qs - QueryString)
console.log('------------------------ 业务处理方法')
console.log(req.query)
// 返回前端信息
res.send({code: 200, message: 'success', data: req.query})
})