node.js基础
前情了解
Node.js 是什么? 把 JavaScript 运行在操作系统上的运行环境(将 V8 引擎拿到其他的运行平台)。
浏览器是如何把 JS 代码跑起来的呢? 每个浏览器中有处理 JS 代码的引擎,像是翻译工具,将 JS 代码编译成二进制语言让 CPU 去处理后展现在我们的面前。(如著名 V8 引擎)。
那么像浏览器中一些交换(如弹窗)是如何运作的呢? 我们在书写代码的时候去调用浏览器提供的 Api 实现特定效果。如浏览器操作类:弹窗、跳转、历史记录。DOM 节点操作类:节点获取、节点删除。网络操作类:Ajax、websocket。
Node.js 与 JavaScript 是什么关系? 可以把 Node.js 当成运行环境,Node.js 可以解析它后,可以让它 JS 跑在操作系统上。
Node.js 能做什么
通过网络与读写操作来实现 web 服务器开发
操作数据库
发送网络请求
通过操作网络来实现网络爬虫开发
通过读写功能完成一套脚手架工具
Node.js 发展历史? 08 年 V8 引擎问世,带来了能操作操作系统的 Api,进而实现了 Node.js(09 年 Ryan Dahl 发布)
下载
官网:Node.js
如何使用 Node.js 把 JavaScript 跑起来
如在桌面创建一个 JS 文件,如 index.js
使用命令行执行 (cmd) 进到桌面
运行 node index.js
就跑起来了!
文件操作
文件操作主要是引用 Node.js 提供的 fs 模块来处理
1 | // 读文件 |
1 | // 写入文件内容 |
1 | // 在文件中追加内容 |
模块化编程概念
require(“fs”) 是什么意思? 使用 require() 去引用 Node.js 提供的 fs 模块
我们为什么需要模块化? 拆分代码,相互独立(可以解耦),导入导出
JavaScript 有哪些模块化规范? Common.js、ES Module
模块化开发规范
ES Module 导入导出
首先注意 Node.js 本身不默认支持,所以需要在 package.json 中声明 { “type” : “module” } 或者使用 .mjs 后缀 。
分别导入 or 导出
export { num } :将需要导出的模块变量名放入 {} 中。
import { num } from “文件路径”:分别导入
export { num as num1 }:别名导出,导入是 num1 变量而不是 num。
import { num as number }:别名导入,后续代码需要用 number 变量才能取到值。
默认导入 or 导入
export default {} 默认导出,此 JS 默认导出一个
import num form “文件名”:与分别导入区别是不需要加括号,因为只有一个模块或变量被暴露。
Common Module
导入导出:Node.js 默认支持,在 JS 中 Module 是全局的。
导入
1 | // 导出模块 m1.js |
导入
1 | // 导入模块 同根目录下的 m1.js |
npm 包管理器
是什么?是 npm 第三方包进行管理的工具,你可以自行上传你写好的模块等工具或使用 npm 下载他人写好的工具包。
初始化 npm 项目 npm init
生成 package.json 文件
配置 package.json 文件
自定义脚手架
什么是脚手架?全局命令行工具、创建项目初始化代码文件及目录
脚手架的基本能力?全局命令行执行能力,命令行交互能力
如何自定义一个脚手架?创建自定义全局命令,命令参数接收处理,终端交互,下载远程项目代码,项目初始化完成提示。
npm 辅助库
commander:负责参数解析为选项和命令参数
inquirer:负责提供用户界面和查询会话流程
download-git-repo:从远程仓库下载代码
ora:命令行等待工具
chalk:终端字符串样式
代码参考
需求:创建一个可以下载拉 git 仓库代码的脚手架,目前需求是能下 express、koa、egg 三个框架自定义初始化项目。日常使用可以自己修改需要的框架 list 即可。
代码仓库:GitHub - wu-honghao/h-cli
发布
参考:npm 包发布
Node 实现服务器逻辑
推荐安装:nodemon 可以热更新服务器 npm i nodemon -g
使用 Node 创建一个 HTTP 的服务器,并能够接收到客户端发来的请求
获取到客户端具体的请求数据,并根据不同的请求数据进行处理
将处理之后的结果,响应回客户端,并断开本次链接
需求:处理返回一个 html 及其内容、处理表单 post 提交
1 | // server.js |
1 | // router.js |
1 | // controller.js |
Express
是什么?高度包容、快速而极简的 Node.js Web 框架
应用场景:Web 应用程序(网站)、API 接口服务器、服务器渲染中间键,开发辅助工具,自定义集成框架
特性:上手简单,具有丰富的 API 支持,强大的路由功能,灵活的中间键及丰富的第三方中间支持,性能接近原生 Node
用户增删改查
需求:对用户的信息进行增删改查
案例:GitHub - wu-honghao/express-video-server 版本号:0e68ee4
HTTP 响应状态码
1xx : 信息性
2xx : 成功
3xx : 重定向
4xx : 客户端错误
5xx : 服务端错误
MongoDb 使用
下载 MongoDB 非关系型数据库 & Navicat 数据库图形化界面工具
MongoDB 软件:https://www.mongodb.com/try/download/community2 v5.0.13
MongoDB 安装教程:https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-windows/
Navicat:https://www.navicat.com.cn/download/navicat-premium
破解 Navicat:https://learnku.com/articles/67706
Navicat 建立 MongoDB 连接
Navicat 中新建数据库和集合表
1 | use mytest // 切换数据库。不存在的也允许切换,但只是在内存中存在,只有库中有数据才能保留下来 |
增删改查
1 | //db.user.insertOne({username:'lisi',age:12}) // 插入一条数据 |
Node.js 项目中使用 mongodb
在项目中安装 mongodb 使用依赖的库:npm install mongodb
记得现在 Navicat 中连接 Mongodb 执行生成数据库 video 和 user 集合后再跑这个案例,不然会找不到数据库的。
1 | use video // 切换数据库。不存在的也允许切换,但只是在内存中存在,只有库中有数据才能保留下来 |
下面是使用的一个小案例
1 | // index.js |
Express 中间件分类
- 应用程序级别的中间件
- 路由级别的中间件
- 错误处理中间件
- 内置中间件
- 第三方中间件
应用级别中间件
基本中间件
1 | app.use((req, res, next) => { |
限定请求方法中间件
1 | app.get('/user', (req, res, next) => { |
多个处理函数针对一个路由的匹配规则
1 | app.get( |
小项目 express video
实现登录注册,用户列表的返回
登录
首先在路由中添加一个中间件 router.get("/logins",校验,具体的登录业务的回调)
,后续客户端在访问这个路径后就能调用对应的业务代码
校验逻辑
下面的校验方式使用的是函数调用验证方式而非直接编写规则在中间件上,此处理解的不深,具体看官方文档:https://express-validator.github.io/docs/running-imperatively.html
1 | // middleware/validate/userValidate.js |
1 | // middleware/validate/errorBack.js |
1 | // 路由中编写规则 |
业务
封装数据库查询的方法后去调用 mongoose
文件上传
使用到的库: multer (npm)
设置路径拿到 upload 方法
1 | const upload = multer({dest:'public/'}) |
post 请求中设置只读 headimg 的上传内容
1 | // .post token 认证后加上 upload.single('headimg') |
处理文件改名 fs.rename,同步就用 promisify()
支持静态资源访问,后续直接在服务器端口后直接拼接访问即可
1 | // 在 app.js 中处理 |