问题区 & Todolist
问题分类标签1
问题分类标签2
问题分类标签3
问题分类标签4
一、node模块化概念
1.模块分类
1.内部模块
path模块: nodejs中的path模块用于处理文件和目录的路径<br /> url模块:nodejs中url模块是用来解析url地址的<br /> fs模块:文件操作系统的API<br /> http模块:创建服务器的
2.第三方模块
3.自定义模块
2.模块的使用
#内部模块
const fs = requrie('fs')
#第三方模块
const getRouter = require('router')
#自定义模块
const newone = require('./newone')
3.模块作用域
自身模块的变量和方法无法被其它模块获取
想要使得共享模块中的变量和方法等可以利用module.exprots对象
exprots和module.exprots指向同一个对象
exports = module.exports,是因为他们是引用类型的一个变量名,
所以当exports再指向一个引用类型的时候,那么他们就不再全等
涉及到栈和堆的知识 类似于java中String、Integer
console.log(module.exports === exports);
//输出结果为:true
exports = [0, 1];
console.log(exports === module.exports);
//输出结果为:false
但是值得注意的是const newone = require(‘./newone’)获取的始终是module.exprots对象
const username="张三"
const password="1002"
//创建一个变量挂载共享
module.exprots.name="李四"
//将已有的变量挂载共享
module.exprots.username=username
//使用exprots挂载共享
exprots.password=password
//也可以挂载对象
module.exports.name={word:213,ss:"asdad"}
exports.abd={oppo:12312,name:"test"}
//挂载方法
module.exports.test=function(){
console.log("hello word!")
}
4.模块加载机制
1.内置模块由Node.js官方提供,内置模块的加载优先级最高
2.模块加载在缓存当中,多次加载同一个模块没有作用
3.自定义模块必须指定以 ./ 或 ../ 开头的路径标识符
4.模糊加载顺序
//自定义模块
const m = require('./test)
//1.按照确切的文件名进行加载
//2.补全.js拓展名进行加载
//3.补全.json拓展名进行加载
//4.补全.node拓展名进行加载
//5.加载失败 终端报错
//加载第三方模块
const m = require('moment')
//会反复往上级目录找到modules.node文件夹
二、npm包的使用
1. npm -install 简写为 npm -i
2. 切换镜像服务器 最好切换为淘宝下载点
#查看当前下载包的镜像源
npm config get registry
#将下载包的镜像源切换为taobao
npm config set registry=https://registry.npm.taobao.org/
3. 使用nrm工具
#通过npm包管理器,将nrm安装为全局可使用的工具
npm i nrm -g
#查看所有可用 的镜像源
nrm -ls
#将下包的镜像源切换为taobao镜像
nrm use taobao
4.开发自己的包
1.新建itheima-tools文件夹
2.文件夹下应该有这三个文件:
package.json(包管理配置文件)
index.js(包的入口文件)
Readme.md(包的说明文件)
3.代码部分
初始化package.json
{
"name": "itheima-tools", //包的名称
"version":"1.0.0", //版本号,默认为1.0.0
"main":"index.js", //包入口文件
"description":"test", //描述,这里输入了test
"keywords": "shaopj", //关键字,
"author": "dxy", //作者
"license":"ISC" //许可
}
#系统自动生成一个初始包的json配置文件
npm init -y
5.发布自己的包
- 切换下载源到官方服务器地址
- 登录npm网站 终端 npm login
- 发布包 npm pulish
(注意 发布前先看包是否和别人重名,发布包名不能大写)
- 删除已经发布的包 npm unpublish
三、Express
1.初识Express
1.Express简介
- Express是基于node.js内置的http模块封装的快速、开放、极简的web开发框架
- Express可以快速创建web网站服务器或API接口的服务器
2.Express安装
#终端命令 npm i express3.创建基本的web服务器
```javascript //1.导入express const express = require(‘express’) const req = require(‘express/lib/request’) const res = require(‘express/lib/response’)
//2.创建web服务器 const app = express() //3.启动web服务器 app.listen(80,()=>{ console.log(“express run webapp on 80”) })
<a name="Ae0Rl"></a>
#### 4.Express的Get和Post请求
```javascript
//监听客户端的get和post请求
app.get('/user',(req,res)=>{
//调用express提供的res.send()方法,向客户端响应一个json对象
res.send({name:'zs',age:20,gender:'男'})
})
app.post('/user',(req,res)=>{
//调用express提供的res.send()方法,向客户端响应一个文本字符
res.send('请求成功')‘
//获取客户端的传参
console.log(req.query)
})
//注意:这里的:id是一个动态的参数
app.post('/user/:id',(req,res)=>{
//req.params 是动态匹配到的URL参数,默认是一个空对象
console.log(req.params)
})
5.Express.static静态托管
#将public文件夹静态托管 可以直接访问
app.use(express.static('./public'))
#多次调用express.static()方法可以托管多个静态目录
#如果希望在托管的静态资源访问路径之前,挂载路径前缀
app.use('./public',express.static('public'))
6.使用nodemon
1.nodemon的安装
//全局安装nodemon
npm install -g nodemon
2.Express路由
创建路由模块
//创建路由对象
var router = express.Router()
//注册路由
app.use(router)
router.get('/user/list',function(res,req){
res.send('Get user list.')
})
router.post('/user/add',function(req,res){
res.send('Add new user.')
})
路由的匹配过程
每当一个请求到达服务器之后,需要先经过路由的匹配,只有匹配成功之后,才会调用对应的处理函数。 在匹配时,会按照路由的顺序进行匹配,如果请求类型和请求的 URL 同时匹配成功,则 Express 会将这次请求,转 交给对应的 function 函数进行处理。
路由前缀
//1.导入路由模块
const userRouter = require('./router/user.js')
//2.使用app.use()注册路由模块 并添加统一的访问前缀/api
app.use('./api',userRouter)
Express中间件
1.中间件概念
- 中间件(Middleware ),特指业务流程的中间处理环节
- 调用流程: 当一个请求到达 Express 的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理
- 中间件格式: Express 的中间件,本质上就是一个 function 处理函数,Express 中间件的格式如下

注意:中间件函数的形参列表中,必须包含 next 参数。而路由处理函数中只包含 req 和 res。
- next 函数是实现多个中间件连续调用的关键,它表示把流转关系转交给下一个中间件或路由。
2.定义中间件
可以使用 app.use() 连续定义多个全局中间件, 执行顺序为中间件定义的先后
```javascript const express = reqiure(‘express’) const app = express()
//定义一个最简单的中间件函数 const mw = function(req,res,next){ console.log(‘这是最简单的中间件函数’) //把流转关系,转交给下一个中间件或路由 next() }
app.listen(80,()=>{ console.log(‘hettp://127.0.0.1’) })
//全局生效的中间件 app.use(mw)
全局中间件的简化形式
```javascript
//全局生效的中间件
app.use(function (req,res,next){
console.log('这个一个简单的中间件函数')
next()
}
不使用 app.use() 定义的中间件,叫做局部生效的中间件,示例代码如下:
//定义中间件函数mw1
const mw1 = function(req,res,next){
console.log('这是中间件函数')
next()
}
//局部生效的中间件,mw1只在当前路由中生效
app.get('./',mw1,function(req,res){
res.send('Home page.')
})
//定义多个局部生效中间件
app.get('./',[mw1,mw2,mw3],function(req,res){
res.send('Home page.')
})
四、技术笔记
一些工具代码
转义html 和 还原html
#转义html
function htmlEscape(htmlStr){
return htmlStr.replace(/<|>|"|&/g,(match)=>{
switch(match){
case'<':
return '<'
case'>':
return'>'
case'"':
return'"'
case'&':
return'&'
}
})
}
还原html
小记
零碎知识点
