Express框架
特性:
提供了方便简介的路由定义方式
对获取HTTP参数请求进行了简化处理
提供了中间件机制有效控制HTTP请求
拥有大量第三方中间件对功能进行扩展
一、基本使用方法
const express = require('express'); //引入express框架
const app = express(); //创建web服务器
app.get('/', (req, res) => {
res.send('Hello express');
})
app.listen(3000); //监听端口
console.log('服务器启动成功');
运行方法:
在当前目录中打开windows powershell
输入node (文件名).js
在浏览器中输入localhost:3000便可以看到效果
send()方法内部会检测响应内容的类型,会自动设置http状态码
也可以显示json对象
const express = require('express'); //引入express框架
const app = express(); //创建web服务器
app.get('/request', (req, res, next) => {
req.name = "zhangsann";
next();
})
app.get('/request', (req, res) => {
res.send(req.name);
})
app.listen(3000); //监听端口
console.log('服务器启动成功');
next作为中间件,当匹配完一个路由的时候会继续匹配下一个路由,继续执行
二、app.use中间件
app.use匹配所有的请求方式,可以直接传入请求处理函数,代表接受所有的请求
app.use 第一个参数也可以传入请求地址,代表无论什么请求方式,只要是这个请求地址就接收这个请求
const express = require('express'); //引入express框架
const app = express(); //创建web服务器
//接受所有请求的中间件
app.use((req, res, next) => {
console.log('app.use中间件')
next()
})
//访问/request请求的时候走当前中间件
app.use('/request', (req, res, next) => {
console.log('request/app.use中间件')
next()
})
app.get('/list', (req, res) => {
res.send('/list')
})
app.get('/request', (req, res, next) => {
req.name = "zhangsann";
next();
})
app.get('/request', (req, res) => {
res.send(req.name);
})
app.listen(3000); //监听端口
console.log('服务器启动成功');
三、中间件的应用
1、路由保护:客户端在访问需要登录的页面时,先使用中间件判断用户的登录状态,如果用户没有登录,则拦截请求,禁止进入需要的页面
const express = require('express'); //引入express框架
const app = express(); //创建web服务器
app.use('/admin', (req, res, next) => {
let islogin = true;
if (islogin == true) {
next() //如果已经登录,则继续向下执行
} else {
res.send('尚未登录,不能访问当前页面')
}
})
app.get('/admin', (req, res) => {
res.send('已经登录,可以访问当前页面')
})
app.listen(3000); //监听端口
console.log('服务器启动成功');
此时状态:
2、网站的维护公告:在所有路由的最上面定义接收所有请求的中间件,直接为客户端做出相应,网站正在维护中
const express = require('express'); //引入express框架
const app = express(); //创建web服务器
app.use((req, res, next) => {
res.send('当前网站正在维护。。。') //没有next,请求直接终止
})
app.use('/admin', (req, res, next) => {
let islogin = true;
if (islogin == true) {
next() //如果已经登录,则继续向下执行
} else {
res.send('尚未登录,不能访问当前页面')
}
})
app.get('/admin', (req, res) => {
res.send('已经登录,可以访问当前页面')
})
app.listen(3000); //监听端口
console.log('服务器启动成功');
3、定义404页面
const express = require('express'); //引入express框架
const app = express(); //创建web服务器
app.use('/admin', (req, res, next) => {
let islogin = true;
if (islogin == true) {
next() //如果已经登录,则继续向下执行
} else {
res.send('尚未登录,不能访问当前页面')
}
})
app.get('/admin', (req, res) => {
res.send('已经登录,可以访问当前页面')
})
app.use((req, res, next) => {
res.status(404).send('当前页面不存在')
})
app.listen(3000); //监听端口
console.log('服务器启动成功');
四、错误处理中间件
是一个集中处理错误的地方
const express = require('express'); //引入express框架
const app = express(); //创建web服务器
app.get('/index', (req, res) => {
throw new Error('程序发生了未知错误') //会自动执行错误处理中间件
})
//错误处理中间件
app.use((err, req, res, next) => {
res.status(500).send(err.message); //里面保存了错误信息
})
app.listen(3000); //监听端口1
console.log('服务器启动成功');
以上方法只能执行同步请求
当程序出现错误时,调用next()方法,并且将错误信息通过参数的形式传递给next()方法,即可触发错误处理中间件
const express = require('express'); //引入express框架
const fs = require('fs'); //引入fs模块
const app = express(); //创建web服务器
app.get('/index', (req, res, next) => {
//throw new Error('程序发生了未知错误') //会自动执行错误处理中间件
fs.readFile('./01.js', 'utf-8', (err, result) => {
//err如果是空的,则代表读取成功
//err如果是一个对象,则读取失败
if (err != null) {
next() //传送至下一个路由进行处理
} else {
res.send(result)
}
})
})
//错误处理中间件
app.use((err, req, res, next) => {
res.status(500).send(err.message); //里面保存了错误信息
})
app.listen(3000); //监听端口
console.log('服务器启动成功');
代表成功读取文件
总结:错误处理中间件有四个参数,只能捕获同步代码执行出错,如果异步代码执行出错,则无法捕获,此时需要手动调用next方法,且给next方法传递参数,才能触发错误处理中间件
五、构建模块化路由
//引入express框架
const express = require('express');
//创建网站服务器
const app = express();
//创建路由对象
const home = express.Router();
//为路由对象匹配请求路径
app.use('/home', home);
//创建二级路由
home.get('/index', (req, res) => {
res.send('欢迎来到页面')
})
//端口监听11
app.listen(3000)
构建多页面路由
//引入express框架
const express = require('express');
//创建网站服务器
const app = express();
//导入路由模块
const home = require('./route/home');
const admin = require('./route/admin');
//不同后缀使用不同的路由模块,路由模块单独放入一个文件中
app.use('/home', home);
app.use('/admin', admin);
//端口监听11
app.listen(3000)
//路由1
const express = require('express');
const home = express.Router();
home.get('/index', (req, res) => {
res.send('欢迎来到首页页面')
});
module.exports = home; //对该路由模块进行导出
//路由2
const express = require('express');
const admin = express.Router();
admin.get('/index', (req, res) => {
res.send('欢迎来到管理页面')
});
module.exports = admin; //对该路由模块进行导出
六、get参数的获取
express框架中使用req.query获取get参数,框架内部会将get参数转换为对象并返回
//引入express框架
const express = require('express');
//创建网站服务器
const app = express();
app.get('/index', (req, res) => {
//获取get请求参数
res.send(req.query)
})
//端口监听11
app.listen(3000)
七、post参数的获取
express中接收post请求参数需要借助第三方包body-parser
html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="http://localhost:3000/add" method="post">
<input type="text" name="username">
<input tepe="password" name="password">
<input type="submit" name="">
</form>
</body>
</html>
路由代码
//引入express框架
const express = require('express');
const body = require('body-parser');
//创建网站服务器
const app = express();
//拦截所有请求
//extended:false方法内部使用querystring模块处理请求参数的格式
//extended:true方法内部使用第三方模块qs处理请求参数的格式
app.use(body.urlencoded({ extended: false }));
app.post('/add', (req, res) => {
//接收post请求参数
res.send(req.body)
})
//端口监听11
app.listen(3000)
效果:在黑窗口中打开html之后,在表单中输入内容,内容就被上传到对应的服务器地址当中了
app.use()返回的是函数的调用
八、express路由参数
方法:
app.get('/find/:id',(req,res)=>{
console.log(req.params);
});
localhost:3000/find/123
params存储的是一个对象,对象内部就是参数
//引入express框架
const express = require('express');
const body = require('body-parser');
//创建网站服务器
const app = express();
app.get('/index/:id', (req, res) => {
res.send(req.params) //通过这个参数进行获取
})
//端口监听11
app.listen(3000)
//注:只有匹配到参数才能连接到路由,否组无法连接到路由
重点是app.get那一块
九、静态资源的处理
通过express内置的express.static可以方便地托管静态文件,例如img CSS Javascript文件等
const express = require('express');
const path = require('path');
const app = express();
//获取当前文件所在的路径
app.use(express.static(path.join(__dirname, 'public')))
app.listen(3000);
在浏览器中直接输入public文件夹下的静态资源文件名
例如
http://localhost:3000/images/litten.jpg
http://localhost:3000/css/style.css
http://localhost:3000/js/app.js
http://localhost:3000/hello.html(因为直接存在于html目录下)