Node.js-模块化/包/express路由


模块化

提高代码的复用性,可维护性,实现按需加载   Node.js根据模块的来源不同,分为三类 内置模块:fs,path,http 自定义模块:用户自己创建的 第三方模块:需要下载的   加载模块 使用require() 注:加载自定义模块,需要注意路径问题   模块作用域:只能在该模块使用定义在该模块中的变量 好处:防止全局变量污染的问题   向外共享模块作用域中的成员 设置一个自定义模块
module.exports.username = 'zs';
module.exports.sayhello = function () {
    console.log('hello');
}

设置测试

//在外界使用require倒入一个自定义模块的时候,得到的成员便是module.exports所指向的对象
const m = require('/Users/shuchenhao/Desktop/web前端学习/Node/自定义模块.js');
console.log(m);
终端显示结果 shuchenhao@shuchenhaodeMacBook-Air Node % node test1.js { username: 'zs', sayhello: [Function (anonymous)] }

共享成员的注意点

使用require()方法导入模块时,导入的结果,永远以module.exports指向的对象为准。
module.exports.username = 'zs';
module.exports.sayhello = function () {
    console.log('hello');
}
module.exports = {
    nickname: '小黑',
    sayhi() {
        console.log('hi');
    }
}
终端 shuchenhao@shuchenhaodeMacBook-Air Node % node test1.js { nickname: '小黑', sayhi: [Function: sayhi] }   exports和module.exports指向同一个对象,最终共享的结果永远以module.exports指向的对象为  

第三方模块也称为包 从https://www.npmjs.com网站上搜索自己需要的包   通过导入moment包,使用高级操作对时间进行格式化 导入moment包的命令:npm install moment
//导入moment名称
const moment = require('moment');
const dt = moment().format('yyyy-mm-dd hh:mm:ss');
console.log(dt);
如何安装指定的版本号的包 Npm install monent@2.22.2 同时最新的命令去安装包会覆盖之前安装的包   解决下包速度慢的问题 切换npm的下包镜像源 shuchenhao@shuchenhaodeMacBook-Air Node % npm config get registry https://registry.npmjs.org/ shuchenhao@shuchenhaodeMacBook-Air Node % npm config set registry=https://registry.npm.taobao.org/ shuchenhao@shuchenhaodeMacBook-Air Node % npm config get registry                                  https://registry.npm.taobao.org/    

包的分类

项目包 开发依赖包:被记录到devDependencies节点中的包,只在开发期间会用到 核心依赖包:被记录到dependencies节点中的包,在开发期间和项目上线之后都会用到   全局包:在执行安装命令的时候,如果提供-g参数,  

开发自己的包

首先建立一个文件夹包含以下文件

在package.json中,存放版本,名称等内容

{
    "name": "ith-tools",
    "version": "1.2.0",
    "main": "index.js",
    "description": "提供了格式化时间,HTMLEscape相关功能",
    "keywords": [
        "ith",
        "dateFormat",
        "escape"
    ],
    "license": "ISC"
}

在index.js中存放

//包的入口
const date = require('./dataformat.js')
const escape = require('./htmlEscape.js')

module.exports = {
    ...date,
    ...escape
}

在dataformat.js用于存放时间格式化的模块

//时间格式化
function dataformat(datastr) {
    const dt = new Date(datastr);
    const y = padZero(dt.getFullYear());
    const m = padZero(dt.getMonth() + 1);
    const d = padZero(dt.getDate());
    const hh = padZero(dt.getHours());
    const mm = padZero(dt.getMinutes());
    const ss = padZero(dt.getSeconds());
    return y + '-' + m + '-' + d + ' ' + hh + ':' + mm + ':' + ss;


}
//定义补0函数
function padZero(n) {
    return n > 9 ? n : '0' + n;

}

module.exports = {
    dataformat
}

在htmlEscape中存放转义html字符的函数模块

//定义转义HTML字符的函数
function htmlEscape(htmlstr) {
    return htmlstr.replace(/<|>|"|&/g, (match) => {
        switch (match) {
            case '<': return '<';
            case '>': return '>';
            case '"': return '"';
            case '&': return '&';
        }

    });
};
//定义还原HTML字符串的函数
function htmlUnEscape(str) {
    return str.replace(/<|>|"|&/g, (match) => {
        switch (match) {
            case '<': return '<';
            case '>': return '>';
            case '"': return '"';
            case '&': return '&';
        }

    });
};


module.exports = {
    htmlEscape,
    htmlUnEscape
}

在readme中存放介绍

##安装
‘’‘
npm install ith-tools
'''

##导入
‘’‘js
const itheima=require('ith-tools')
'''

##格式化时间
‘’‘js
//调用dateformat格式化时间
const newTIME = itheima.dataformat(new Date());
console.log(newTIME);
'''

##转义html中的特殊字符
‘’‘js
//带转换的字符串
const htmlstr = '

这是目标标签123 

'; //调用htmlEscape方法进行转换 const str = itheima.htmlEscape(htmlstr); console.log(str); ‘’‘ ##还原html中的特殊字符串 ’‘’js //带还原的html字符串 const str2 = itheima.htmlUnEscape(str); console.log(str2); ‘’‘ 开源协议 ISC

然后发布过程如下

1.注册npm账号 2.终端中登陆npm shuchenhao@shuchenhaodeMacBook-Air Node % npm login npm notice Log in on https://registry.npmjs.org/ Username: shuchenhao Password:  Email: (this IS public) 1360037851@qq.com npm notice Please check your email for a one-time password (OTP) Enter one-time password: 08342327 Logged in as shuchenhao on https://registry.npmjs.org/.   3.切换到发布包文件夹下面输入发布命令 npm publish  

模块的加载机制

 内置模块是由官方提供的模块,内置模块的加载优先级最高。    

Express

基于node.js平台,快速、开放、极简的web开发框架 4.17.1版本   Express基于http模块封装出来的,提高开发效率 常见两种服务器 Web网站服务器:对外提供web网页资源的服务器  API接口服务器:对外听过API接口的服务器 使用express,可以方便快速创建web网站服务器和API接口服务器     安装express npm install express   创建一个基本的web服务器
//导入
const express = require('express');
//创建web服务器
const app = express();
//监听get请求
app.get('/user', (req, res) => {
    res.send({ name: 'ss', age: 20 });
});
app.post('/user', (req, res) => {
    res.send('请求成功');
})
//  启动
app.listen(80, () => {
    console.log('express running at http://127.0.0.1');
})
 终端运行服务器之后,通过postman进行接口测试 监听get请求 监听post请求

获取URL中带的参数

app.get('/', (req, res) => {
    //通过req.query可以获取到客户端发送过来的查询参数
    //默认情况下req.query是空对象
    console.log(req.query);
    res.send(req.query);
})

在query params中输入key和value,点击send,则可以在终端中获取URL中所带的参数

shuchenhao@shuchenhaodeMacBook-Air Node % node 使用express创建服务器.js express running at http://127.0.0.1 {} { name: 'ss', age: '10’ }

获取URL中的动态参数

//这里的:id是个动态参数
app.get('/user/:id', (req, res) => {
    //动态匹配的URL参数,默认的也是一个空对象
    console.log(req.params);
    res.send(req.params)
})

在user/之后不管输入几,都是动态获取到Id的值

终端结果 shuchenhao@shuchenhaodeMacBook-Air Node % node 使用express创建服务器.js express running at http://127.0.0.1 { id: '1’ }   可以设置多个动态参数
app.get('/user/:id/:name', (req, res) => {
    //动态匹配的URL参数,默认的也是一个空对象
    console.log(req.params);
    res.send(req.params)
})

shuchenhao@shuchenhaodeMacBook-Air Node % node 使用express创建服务器.js express running at http://127.0.0.1 { id: '3', name: 'sch' }

托管静态资源

通过express.static(),可以创建一个静态资源服务器, 如下,可以将public目录下的图片、css文件、js文件对外开放访问 注:express在指定的目录中查找文件,并对外提供资源的访问路径,因此,存放静态文件的目录名不会出现在URL中
const express = require('express');
const app = express();
//调用express.static()方法,快速对外提供静态资源
app.use(express.static('./anli'));
app.listen(80, () => {
    console.log('express running at http://127.0.0.1');
})

托管多个静态资源目录

多次调用express.static()函数 根据目录的添加的顺序查找所需的文件。  

挂载路径前缀 

 
app.use('/abc', express.static('./files'));
在网页中输出的时候要加上/abc前缀  

 Nodemon

 在编写调试node.js项目的时候,如果修改了项目的代码,则需要频繁的手动close,然后在重新启动,nodemon工具可以监听项目的变动,重新启动项目。  

Express路由

在express中,路由指客户端请求和服务器处理函数之间的映射关系。 Npm init -y初始化一个package.json 包管理配置文件  

模块化路由

不建议直接吧路由直接挂载在app上,推荐模块化   创建路由模块
//路由模块
const express = require('express');
const router = express.Router();
//挂载具体路由
router.get('/user/list', (re1, res) => {
    res.send('Get user list');
})
router.posy('/user/add', (re1, res) => {
    res.send('Add new user');
})
//导出路由对象
module.exports = router;

再另一个js文件中注册路由

const express = require('express');
const app = express();
//导入路由模块
const router = require('./模块化路由.js');
//注册路由模块
app.use(router);

app.listen(80, () => {
    console.log('http://127.0.0.1');
})

为路由库快添加前缀

app.use('/api', router);