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);