[toc]
1、模块化
1.1:模块化的基本概念
(1)什么是模块化 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。
(2)编程领域中的模块化 编程领域中的模块化,就是遵守固定的规则,把一个大文件拆成独立并互相依赖的多个小模块。
把代码进行模块化拆分的好处:
- 提高了代码的复用性
- 提高了代码的可维护性
- 可以实现按需加载
1.2:Node.js中的模块化
(1)Node.js中模块的分类 Node.js中根据模块来源的不同,将模块分为了3大类,分别是:
- 内置模块(内置模块是由Node.js 官方提供的,例如fs、path、http等)
- 自定义模块(用户创建的每个.js文件,都是自定义模块)
- 第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)
(2)加载模块 使用强大的require()方法,可以加载需要的内置模块、用户自定义模块、第三方模块进行使用。例如:
// 1.加载内置的fs模块
const fs = require('fs')
// 2.加载用户的自定义模块
const custom = require('./custom.js')
// 3.加载第三方模块
const moment = require( 'moment' )
(3)Node.js中的模块作用域
什么是模块作用域
和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域。
模块作用域的好处
防止了全局变量污染的问题
2、Express
Express是基于Node.js平台,快速、开放、极简的Web开发框架。
通俗的理解:Express的作用和Node.js 内置的 http模块类似,是专门用来创建Web服务器的。
Express的本质:就是一个npm上的第三方包,提供了快速创建Web服务器的便捷方法。
使用Express,我们可以方便、快速的创建Web 网站的服务器或API接口的服务器。
2.1 Express的基本使用
(1)安装Express
npm i [email protected]
(2)创建基本的Web服务器
// 1.导入express
const express = require('express')
// 2.创建web服务器
const app = express()
// 3.调用app.listen(端口号,启动成功后的回调函数),启动服务果
app.listen(80, () => {
console.log( 'express server running at http://127.0.0.1')
})
(3)监听GET请求
通过app.get()方法,可以监听客户端的GET请求。
// 参数1:客户端请求的URL地址
// 参数2:请求对应的处理函数
// req:请求对象(包含了与请求相关的属性与方法)
// res:响应对象(包含了与响应相关的属性与方法)
app.get( '请求URL', function(req,res) {/*处理函数*/})
(4)监听post请求
通过app.post()方法,可以监听客户端的GET请求。
// 参数1:客户端请求的URL地址
// 参数2:请求对应的处理函数
// req:请求对象(包含了与请求相关的属性与方法)
// res:响应对象(包含了与响应相关的属性与方法)
app.post( '请求URL', function(req,res) {/*处理函数*/})
(5)把内容响应给客户端
通过res.send(方法,可以把处理好的内容,发送给客户端:
app.get('/user', (req, res) =>{
// 向客户端发送JSON对象
res.send({ name:'zs', age: 20, gender: '男'})
})
app.post( '/user', (req,res) =>{
// 向客户端发送文本内容
res.send('请求成功')
})
示例:
// 1.导入express
const express = require('express')
// 2.创建web服务器
const app = express()
// 监听客户端的 GET 和 POST 请求,并向客户端响应具体的内容
app.get('/user', (req, res) =>{
// 调用express提供的res.sent()方法,向客户端发送JSON对象
res.send({ name:'zs', age: 20, gender: '男'})
})
app.post( '/user', (req,res) =>{
// 调用express提供的res.sent()方法,向客户端发送文本内容
res.send('请求成功')
})
// 3.调用app.listen(端口号,启动成功后的回调函数),启动服务果
app.listen(80, () => {
console.log( 'express server running at http://127.0.0.1')
})
(6)获取 URL中携带的查询参数
通过req.query对象,可以访问到客户端通过查询字符串的形式,发送到服务器的参数:
app.get( ' /', (req, res) => {
// req.query 默认是一个空对象
// 客户端使用?name=zs&age=20这种查询字符串形式,发送到服务器的参数
// 可以通过req.query 对象访问到,例如:
// req.query.name req.query.age
console.log(req.query)
})
示例:
// 1.导入express
const express = require('express')
// 2.创建web服务器
const app = express()
// 通过req.query对象,可以访问到客户端发送过来的查询参数
// 注意默认情况下,req.query是一个空对象
app.get( '/', (req, res) => {
console.log(req.query)
res.send(req.query)
})
// 3.调用app.listen(端口号,启动成功后的回调函数),启动服务果
app.listen(80, () => {
console.log( 'express server running at http://127.0.0.1')
})
(7)获取URL中的动态参数
通过req.params对象,可以访问到URL中,通过**:符号匹配到的动态参数**:
// URL地址中,可以通过:参数名的形式,匹配动态参数值
app.get( '/user/:id', (req, res) => {
// req.params默认是一个空对象
//里面存放着通过:动态匹配到的参数值
console.log(req.params)
})
示例:
const express = require('express')
const app = express()
// 这里的:id是一个动态参数
app.get( '/user/:id', (req, res) => {
// req.params是动态匹配到的URL参数,默认也是一个空对象
console.log(req.params)
res.send(req.params)
})
app.listen(80, () => {
console.log( 'express server running at http://127.0.0.1')
})
2.2 Express托管静态资源
(1)express.static()
通过express.static(),我们可以非常方便地创建一个静态资源服务器,例如,通过如下代码就可以将public目录下的图片、CSS文件、JavaScript文件对外开放访问了:
app.use(express.static('public'))
(2)挂载路径前缀
如果希望在托管的静态资源访问路径之前,挂载路径前缀,则可以使用如下的方式:
app.use('./abcs', express.static('public'))
2.3 Express路由
(1)Express的路由
在Express中,路由指的是客户端的请求与服务器处理函数之间的映射关系。
Express 中的路由分3部分组成,分别是请求的类型、请求的URL地址、处理函数,格式如下:
app.METHOD(PATH, HANDLER)
METHOD:请求类型,值可以使GET也可以是POST
PATH:请求的URL地址
HANDLER:服务器端的处理函数
示例:
// 匹配GET请求,且请求 URL为/
app.get( '/', function (req,res) {
res.send( 'Hello world! ')
})
// 匹配POST请求,且请求URL为/
app.post( '/', function (req,res){
res.send('Got a POST request')
})
(2)路由的使用
示例:
const express = require( 'express') //创建web服务器,命名为app
const app = express()
// 挂载路由
app.get( '/', (req,res)=> { res.send( 'Hello world.')})
app.post( '/', (req,res) => { res.send( 'Post Request.')})
// 启动web服务器
app.listen(80, () => { console.log( 'server running at http://127.0.0.1')})
(3)模块化路由
1)模块化路由 为了方便对路由进行模块化的管理,Express 不建议将路由直接挂载到app 上,而是推荐将路由抽离为单独的模块。
将路由抽离为单独模块的步骤如下:
- 创建路由模块对应的.js文件
- 调用express.Router()函数创建路由对象
- 向路由对象上挂载具体的路由
- 使用module.exports向外共享路由对象
- 使用app.use()函数注册路由模块
2)创建路由模块
var express = require( 'express ')
// 1.导入express
var router = express.Router()
// 2.创建路由对象
router.get( '/user/list',function(req,res) { //3.挂载获取用户列表的路由
res.send( 'Get user list.')
})
router.post( '/user/add', function(req,res) { // 4.挂载添加用户的路由
res.send('Add new user.')
})
module.exports = router // 5.向外导出路由对象
(4)为路由模块添加前缀
类似于托管静态资源时,为静态资源统一挂载访问前缀一样
// 1.导入路由模块
const userRouter = require( './router/user.js')
// 2.使用app.use()注册路由模块,并添加统一的访问前缀/api
app.use( '/api ', userRouter)