问题区 & Todolist

问题分类标签1

问题分类标签2

问题分类标签3

问题分类标签4

一、node模块化概念

1.模块分类

1.内部模块

  1. path模块: nodejs中的path模块用于处理文件和目录的路径<br /> url模块:nodejsurl模块是用来解析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.发布自己的包

  1. 切换下载源到官方服务器地址
  2. 登录npm网站 终端 npm login
  3. 发布包 npm pulish

(注意 发布前先看包是否和别人重名,发布包名不能大写)

  1. 删除已经发布的包 npm unpublish

只能删除发布72小时内发布的包
24小时不能再发布相同的包

三、Express

1.初识Express

1.Express简介

  1. Express是基于node.js内置的http模块封装的快速、开放、极简的web开发框架
  2. Express可以快速创建web网站服务器或API接口的服务器

    2.Express安装

    #终端命令
    npm i express
    

    3.创建基本的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 函数进行处理。
image.png

路由前缀

//1.导入路由模块
const userRouter = require('./router/user.js')

//2.使用app.use()注册路由模块 并添加统一的访问前缀/api
app.use('./api',userRouter)

Express中间件

1.中间件概念

  1. 中间件(Middleware ),特指业务流程的中间处理环节
  2. 调用流程: 当一个请求到达 Express 的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理
  3. 中间件格式: Express 的中间件,本质上就是一个 function 处理函数,Express 中间件的格式如下

image.png
注意:中间件函数的形参列表中,必须包含 next 参数。而路由处理函数中只包含 req 和 res。

  1. 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 '&lt;'
            case'>':
                return'&gt;'
            case'"':
                return'&quot;'
            case'&':
                return'&amp;'
        }
    })
}
还原html

小记

零碎知识点