Express的作用和Node.js内置的http模块类似,是专门用来创建Web服务器的。
常见的两种服务器:
Web网站服务器
:专门对外提供Web网页资源的服务器
API接口服务器
:专门对外提供API接口的服务器。
//1. 导入express
const express = require('express')
//2. 创建web服务器
const app = express()
//4. 监听客户端的GET和POST请求,并向客户端响应具体的内容
app.get('/user', (req, res) => {
//调用express提供的res.send()方法,向客户端响应一个JSON对象
res.send({
name: 'zs',
age: 20,
gender: '男'
})
})
app.post('/user', (req, res) => {
//调用express提供的res.send()方法,向客户端响应一个文本字符串
res.send('请求成功')
})
//获取URL中携带的查询参数
app.get('/', (req, res) => {
//通过 req.query 可以获取到客户端发送来的 查询参数
//注意:默认情况下,req.query 是一个空对象
console.log(req.query)
res.send(req.query)
})
//获取URL中的动态参数(:动态参数)
app.get('/user/:id/:username', (req, res) => {
//req.params 是动态匹配到 URL 参数,默认也是空对象
console.log(req.params)
res.send(req.params)
})
//3. 启动 web 服务器
app.listen(80, () => {
console.log('express server runnning at http://127.0.0.1')
})
express.static()
:创建一个静态资源服务器
Express在指定的静态目录中查找文件,并对外提供资源访问路径,所以,存放静态文件的目录名不会出现在URL中。
如果要托管多个静态资源目录,请多次调用express.static()函数
app.use(express.static('public'))
app.use(express.static('files'))
如果希望在托管的静态资源访问路径之前,挂载路径前缀,则可使用如下方式:
app.use('public', express.static('public'))
此时就可以通过带/public
前缀地址来访问public目录的文件了
该工具能监听项目文件的变动,当代码被修改后,nodemon会自动帮我们重启项目,方便开发和调试
npm install -g nodemon
广义上,路由是映射关系
Express 中的路由指客户端的请求与服务器处理函数之间的映射关系。
EXpress中的路由由3部分组成,分别是请求的类型、请求的URL地址、处理函数:
app.METHOD(PATH, HANDLER)
路由的使用:
把路由挂载在服务器实例上
const express = require('express')
const app = express()
//挂载路由
app.get('/', (req, res) => {
res.send('hello world')
})
app.post('/', (req, res) => {
res.send('Post Request')
})
app.listen(80, () => {
console.log('http://127.0.0.1')
})
模块化路由
为方便对路由进行模块化管理,Express不建议将路由直接挂载到app上,而是推荐路由抽离为单独的模块
02模块化路由.js
const express = require('express')
const app = express()
//1. 导入路由模块
const router = require('./03router')
//2. 注册路由模块
/* app.use(router)*/
app.use('/api', router) //添加前缀,类似于托管静态资源,为静态资源统一挂载访问前缀一样
//注意:app.use() 函数的作业,就是来注册全局中间件
app.listen(80, () => {
console.log('http://127.0.0.1')
})
router.js
//路由模块
//1. 导入 express
const express = require('express')
//2. 创建路由对象
const router = express.Router()
//3. 挂载具体的路由
router.get('/user/list', (req, res) => {
res.send('Get user list')
})
router.post('/user/add', (req, res) => {
res.send('Add')
})
//4. 向外到处路由对象
module.exports = router
本质是function
处理函数,格式如下
app.get('/', fuction(req, res, next){
next();
})
当一个请求到达Express的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理
next函数
:实现多过中间件连续到用的关键,他表示把流转关系转交给下一个中间件或路由
客户端发起任何请求,到达服务器后,都会触发的中间件
const express = require('express')
const app = express()
//定义一个最简单的中间件函数
const mw = function (req, res, next) {
console.log('这是最简单的中间件函数')
//把流转关系,转交给下一个中间件或路由
next()
}
//将 mw 注册为全局生效的中间件
app.use(mw)
app.get('/', (req, res) => {
console.log('调用了这个‘/’路由')
res.send('Home page.')
})
app.get('/user', (req, res) => {
console.log('调用了这个‘/user’路由')
res.send('User page.')
})
app.listen(80, () => {
console.log('http://127.0.0.1')
})
//简化形式
app.use(function (req, res, next) {
console.log('这是一个最简单的中间件函数')
next()
})
中间件作用:多个中间件之间,共享同一份req
和res
,基于该特性,可以在上游
的中间件统一
为req或res对象添加自定义的属性或方法
,供下游
的中间件或路由使用。
不使用app.use()定义的中间件,叫做局部生效的中间件
//导入express模块
const express = require('express')
//创建express的服务器实例
const app = express()
//1. 定义中间件函数
const mw1 = (req, res, next) => {
console.log('调用了局部生效的中间件')
next()
}
//2. 创建路由
app.get('/', mw1, (req, res) => {//mw1就是局部中间件,只在当前路由生效,不会影响其他路由
res.send('Home pages')
})
app.get('/user', (req, res) => {
res.send('User pages')
})
//调用app.listen方法,指定端口号并启动web服务器
app.listen(80, function () {
console.log('Express server running at http://127.0.0.1')
})
定义多个局部中间件
//两种写法都可
app.get('/', mw1, mw2, (req, res) => {res.send('Home page.')})
app.get('/', [mw1, mw2], (req, res) => {res.send('Home page.')})