Node

153 阅读3分钟

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})
})