Nodejs知识汇总
基础知识点
1
npm包
1. 定义
- node中有内置模块,自定义模块和第三方模块(包)
1.1 从哪里下包
该网站上搜索自己所需要的包:https://www.npmjs.com/
该服务器上下载自己所需要的:https://registry.npmjs.org/
Node Package Manager(npm) 将包从服务器https://registry.npmjs.org/下载到本地使用
1.2 dependencies & devDependencies
devDependencies:开发时依赖
简写:npm install 包 -D
完整写:npm install 包 --save-dev
1.3 切换npm镜像
可以通过nrm对下包的镜像源进行管理
- 全局包
- 项目包(dependencies & devDependencies)
2. 发布包
step1: 新建itpackage-tooks文件夹,作为包的根目录
step2: 在itpackage-tooks文件夹中,新建如下三个文件:
- package.json(包管理配置文件)
- index.js (包的入口文件)
- README.md(包的说明文档)
step3:
3. 模块的加载机制
Express
nodejs内置的http模块用起来复杂,开发效率低,express是基于内置的http模块进一步封装出来的,能极大的提升开发效率
// 导入express
const express = require("express");
// 创建web服务器
const app = express();
// 监听客户端的get和post请求,并向客户端响应具体的内容
app.get("/user", (req, res) => {
// req.query可以获取客户端的请求参数,默认是空对象
console.log(req.query);
// express的send方法,既可以响应一个json对象,也可以响应文本
res.send({ name: "xyy", age: 25 });
});
app.post("/user", (req, res) => {
res.send("请求成功");
});
// 启动web服务器
app.listen(80, () => {
console.log("express server running at http://127.0.0.1");
});
使用:
1. express静态资源托管
向外托管多个文件:先托管的clock文件,后托管的files文件,检索文件的时候,会先从clock文件中查询
挂载路径前缀
2. express路由
2.1 路由模块化
2.2 为路由模块添加前缀
3. express中间件
- 定义中间件时,一定要有next参数,并且对next进行调用。
- 使用app.use()将中间件注册为全局生效的中间件
3.1 express常见中间件
/**
* express 中常见的中间件用法,分为5大类
*/
// 1. 应用级别的中间件
// 2. 路由级别的中间件
// 3. 错误级别的中间件
// 4. Express 内置的中间件
// 5. 第三方的中间件
ps: 错误级别的中间件必须放在所有路由后,这样才能捕捉到所有的错误
自定义中间件
// 自定义中间件
const express = require("express");
const app = express();
// 导入node内置模块
const qs = require("querystring");
// 解析表单数据的中间件
app.use((req, res, next) => {
// 定义中间件具体的业务逻辑
// 1. str专门用来存储客户端发送过来的请求体数据
let str = "";
// 2. 监听 req 的 data 事件
req.on("data", (chunk) => {
str += chunk;
});
// 3. 监听 req 的 end 事件(请求体发送完毕后自动触发)
req.on("end", () => {
// 调用qs.parse()方法,把查询字符串解析为对象
const body = qs.parse(str);
// 将解析出的数据对象挂载为req.body
req.body = body;
next();
});
});
app.post("/home", (req, res) => {
console.log("req.body", req.body);
res.send("ok");
});
app.listen(80, () => {
console.log("express is running at http://127.0.0.1");
});
4.解决跨域
数据库
1. 项目中使用mysql
浏览器与node事件循环
https://juejin.cn/post/6844903630038892558 (node eventloop讲的不是很好)
https://juejin.cn/post/7010308647792148511
https://cloud.tencent.com/developer/article/1508127
很多人以为await会一直等待之后的表达式执行完之后才会继续执行后面的代码,实际上await是一个让出线程的标志。await后面的函数会先执行一遍,然后就会跳出整个async函数来执行后面js栈(后面会详述)的代码。等本轮事件循环执行完了之后又会跳回到async函数中等待await