欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Node第3天知识点:在node当中使用art-template、处理GET方式传递的参数、处理POST方式传递数据、服务器端重定向、模块化

程序员文章站 2022-07-02 20:50:08
...

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. 服务器端重定向

  • HTTP 状态码说明

  • 服务器端可以通过响应头中的状态码让浏览器中的页面进行重定向

    res.writeHead(302, {
      'Location': '/'
    })
    res.end()
    

5. 模块化

5.1 模块化介绍

什么是模块化

  • 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。
  • 对于整个系统来说,模块是可组合、分解和更换的单元。

5.2 现实生活中的模块化

Node第3天知识点:在node当中使用art-template、处理GET方式传递的参数、处理POST方式传递数据、服务器端重定向、模块化

Node第3天知识点:在node当中使用art-template、处理GET方式传递的参数、处理POST方式传递数据、服务器端重定向、模块化

5.3 编程领域的模块化

编程领域中的模块化,就是**遵守固定的规则**,把一个大文件拆成独立并互相依赖的多个小模块。

把代码进行模块化拆分的好处:

① 提高了代码的复用性

② 提高了代码的可维护性

③ 可以实现按需加载

5.4 node中模块分类

  • 在nodejs中,应用由模块组成,nodejs中采用commonJS模块规范。
  • 一个js文件就是一个模块
  • 每个模块都是一个独立的作用域,在这个而文件中定义的变量、函数、对象都是私有的,对其他文件不可见。
  • 分类:
    • 1 核心模块 fs path url http querystring
      • 由 node 本身提供,不需要单独安装(npm),可直接引入使用
    • 2 第三方模块(包)
      • 由社区或个人提供,需要通过npm安装后使用
    • 3 自定义模块
      • 由我们自己创建,比如:tool.js 、 user.js

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

  • exportsmodule.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

相关标签: 九:Nodejs nodejs