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 = '<h1 title="abc">这是目标标签<span>123 </span></h1>'; //调用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);

浙公网安备 33010602011771号