Node第3天知识点:在node当中使用art-template、处理GET方式传递的参数、处理POST方式传递数据、服务器端重定向、模块化
1. 在node当中使用art-template
[文档]https://aui.github.io/art-template/zh-cn/docs/
1.1 安装
npm i art-template
1.2 使用
// 在项目当中引入art-template模板
const template = require('art-template')
// 使用template方法将数据和html标签中的结构进行绑定
// template有两个参数
// 第1个参数是待渲染数据的html,要使用路径找到这个文件
// 第2个参数是待渲染的数据,必须是一个对象
// html页面中数据的呈现,与原来浏览器端使用art-template模板一模一样的,该循环的循环,该判断的判断,也是{{}}的形式
let htmlStr = template(path.join(__dirname,'./views/index.html'),{name:'tom',age:20,gender:'男'})
注意
:文件的路径必须是绝对路径
2.处理GET方式传递的参数
2.1 url模块介绍
- 如果前端浏览器发送过来的请求地址当中,没有参数的话,直接使用req.url来获取路径就可以了
- 因为req.url获取的就是端口号后面的内容 比如:
http://127.0.0.1:3000/views/index.html
路径:/views/index.html
- 如果请求的路径中带参数了比如:
http://127.0.0.1:3000/add?name=tom&age=20&gender=男
再用req.url就不好办了 - 因此要使用一个专门的node中内置的核心模块,
url模块
- 此模块是专门用来url地址的,可以将地址中的
路径
和参数
非常方便的分开对待
2.2 url模块的使用
// 引入url模块
const urlObj = require('url')
// 调用方法中的parse方法,对url地址进行解析
const obj = urlObj.parse(req.url[,true])
-
比如当前地址是:http://127.0.0.1:3000/index.html
req.url:
/index.html
const obj = urlObj.parse(req.url)
注意,此时并没有传递第二个参数true
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9MtyfDWM-1594795256349)(images/1567132214866.png)]
-
再来看这个地址:http://127.0.0.1:3000/index.html?id=2&name=tom
req.url:/index.html?id=2&name=tom
const obj = urlObj.parse(req.url)
注意,此时还是没有传递第二个参数true
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eJIewSlF-1594795256352)(images/1567132483750.png)]
-
仍然是这个地址:http://127.0.0.1:3000/index.html?id=2&name=tom
req.url:/index.html?id=2&name=tom
const obj = urlObj.parse(req.url,true)
注意,此时有传递第二个参数true
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cJuzaxba-1594795256354)(images/1567132727666.png)]
小结:如果在写案例或项目的时候,有参数是通过URL拼接传递过来的,则此时在node后端一定要使用url模块来解析。
- 不管请求地址中有没有参数,都要使用:
url.parse(req.url,true)
的方式来处理,返回的是一个对象 - 此对象当中有两个常用属性,一个是
pathname
,一个是query
-
pathname
里面存储的是地址当中的端口号和?之间的路径 比如:/submit
-
query
里面存储的是get方式传递过来的参数,如果没有参数则是null
3.处理POST方式传递的数据
由于POST请求的方式是通过请求体来传递数据,此时在node后端获取数据的方式如下
3.1获取POST请求的数据
// data事件:用来接受客户端发送过来的POST请求数据
// 只要有数据发送过来就会不断的触发datag事件
// chunk是块的意思,表示数据是分块来传输的
let str = "";
req.on('data', chunk => {
str += chunk;
})
// end事件:当POST数据接收完毕时,触发
req.on('end', function () {
cosnole.log(str); // 打印出来的是一个字符串
})
3.2 querystring模块
- 用于解析与格式化 字符串数据
- 注意:只在专门处理查询字符串时使用
// 引入模块
const querystring = require('querystring')
// 将字符串转换成对象
let str = 'name=tom&age=20&gender=男'
let obj = querystring.parse(str) // { name: 'tom', age: '20', gender: '男' }
4. 服务器端重定向
-
服务器端可以通过响应头中的状态码让浏览器中的页面进行重定向
res.writeHead(302, { 'Location': '/' }) res.end()
5. 模块化
5.1 模块化介绍
什么是模块化
- 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。
- 对于整个系统来说,模块是可组合、分解和更换的单元。
5.2 现实生活中的模块化
5.3 编程领域的模块化
编程领域中的模块化,就是**遵守固定的规则**,把一个大文件拆成独立并互相依赖的多个小模块。
把代码进行模块化拆分的好处:
① 提高了代码的复用性
② 提高了代码的可维护性
③ 可以实现按需加载
5.4 node中模块分类
- 在nodejs中,应用由模块组成,nodejs中采用commonJS模块规范。
- 一个js文件就是一个模块
- 每个模块都是一个独立的作用域,在这个而文件中定义的变量、函数、对象都是私有的,对其他文件不可见。
- 分类:
- 1
核心模块
fs path url http querystring- 由 node 本身提供,不需要单独安装(npm),可直接引入使用
- 2
第三方模块
(包)- 由社区或个人提供,需要通过npm安装后使用
- 3
自定义模块
- 由我们自己创建,比如:tool.js 、 user.js
- 1
5.5 模块的导入(加载模块)
-
通过
require("fs")
来加载模块 -
如果是第三方模块,需要先使用npm进行下载
-
如果是自定义模块,需要加上相对路径
./
或者../
,可以省略.js
后缀, -
如果文件名是
index.js
那么index.js也可以省略。 -
模块可以被多次引入,但是只会在第一次加载
-
加载核心模块
// 引入模块 const fs = require('fs');
-
加载第三方模块 第三方模块要先下载,再加载
// 引入模块 const mime = require('mime') const template = require('art-template')
-
加载用户模块
// 加载模块 require('./a') // 推荐使用,省略.js后缀! require('./a.js')
5.6 模块的导出
-
在模块的内部,
module
变量代表的就是当前模块,它的exports
属性就是对外的接口, -
加载某个模块,加载的就是
module.exports
属性,这个属性指向一个空的对象。//module.exports指向的是一个对象,我们给对象增加属性即可。 //module.exports.num = 123; //module.exports.age = 18; //通过module.exports也可以导出一个值,但是多次导出会覆盖 module.exports = '123'; module.exports = "abc";
5.7 module.exports与exports
-
exports
是module.exports
的引用 -
注意:给
module.exports
赋值会切断与exports
之间的联系- 1 直接添加属性两者皆可
- 2 赋值操作时,只能使用
module.exports
console.log( module.exports === exports ) // ==> true // 等价操作 module.exports.num = 123 exports.num = 123 // 赋值操作:不要使用 exports = {} module.exports = {}
5.8模块的加载规则
1.核心模块加载规则 优先从缓存中加载,如果缓存中没有的话,再去执行加载核心模块
2.第三方模块的查找规则
- 首先,node查看项目根目录中有没有'node_modules'文件夹
- 在'node_modules'文件夹中,查找有没有和第三方模块名称一致的文件夹
- 在此文件夹中,查找有没有‘package.json’这个文件
- 在‘package.json’文件中,查找有没有'main'属性
- 如果有'main'属性,并且'main'属性指向的路径存在,那么就尝试加载这个路径指定的文件
- 如果'package.json'文件中,没有'main'属性,或者'main'属性指向的路径不存在,
或者没有'package.json'文件,那么,Node尝试加载模块根目录中'index'相关文件,
加载顺序和之前一样 index.js-->index.json-->index.node
- 如果在'node_modules'文件夹中,找不到对应的模块文件,或者在项目根目录中根本
没有'node_modules'文件,则向上一层文件夹中去查找,查找规则同上
- 如果上一层目录中也没有查找到,则再向上一层去查找,直到找到当前项目所在的盘符
根目录为止如果找到了盘符根目录还找不到,
则报错:'cannot find module ***'
3.用户模块的查找规则
- 如果不写后缀名,则严格按照给定的文件名去查找模块并加载执行
- index--> index.js --> index.json --> index.node
a