express
定义
Express是一个基于Node平台的web应用开发框架,它提供了一系列的强大特性,帮助你创建各种Web应用。简化开发。
我们可以使用npm install express命令进行下载。
框架特性
- 提供了方便简洁的路由定义方式
- 对获取HTP请求参数进行了简化处理
- 对模板引擎支持程度高,方便渲染动态HTML页面
- 提供了中间件机制有效控制HTTP请求
- 拥有大量第三方中间件对功能进行扩展
例子
const express = require('express');
//创建网站服务器
const app = express();
app.get('/', (req, res) => {
//响应,send()会自动检测我们响应内容的类型,从而自动将响应类型设置到响应头header中
//send()可以帮我们设置http状态码
res.send('hello')
});
app.get('/list',(req,res) =>{
//也可以返回json对象
res.send({name: 'li',age:18});
});
app.listen(3000);
//监听端口
console.log("success")
中间件
定义:一些方法,可以接受客户端发来的请求,可以对请求做出响应,也可以将请求传递给下一个中间件进行处理
组成:中间件方法(Express提供,负责拦截请求)和请求处理函数(开发人员提供,负责处理请求)
- 注:可以针对同一个请求设置多个中间件,对同一个请求进行多次处理。
- 默认情况下,请求从上到下依次匹配中间件,一旦匹配成功,终止匹配。
- 可以调用next方法将请求的控制权交给下一个中间件,直到遇到结束请求的中间件。
app.get('/', (req, res,next) => {
//响应,send()会自动检测我们响应内容的类型,从而自动将响应类型设置到响应头header中
//send()可以帮我们设置http状态码
req.name = "lize";
next();//传递给下一个中间件处理函数
});
app.get('/', (req, res) => {
//响应,send()会自动检测我们响应内容的类型,从而自动将响应类型设置到响应头header中
//send()可以帮我们设置http状态码
res.send(req.name)
});
app.use
- 可以针对同一个请求设置多个中间件,对同一个请求进行多次处理。
- 默认情况下,请求从上到下依次匹配中间件,一旦匹配成功,终止匹配。
- 可以调用next方法将请求的控制权交给下一个中间件,直到遇到结束请求的中间
const express = require('express');
//创建网站服务器
const app = express();
//处理所有路径的请求
app.use((req,res,next) =>{
console.log('%s %s', req.method, req.url);
console.log(req.path)
next();
});
app.use('/request',function(req, res, next){
res.send('Hello World');
next();//next是为了让请求继续往下面走
});
app.listen(3000);
//监听端口
console.log("success")
中间件的应用
- 路由保护,客户端在访问需要登录的页面时,可以先使用中间件判断用户登录状态,用户如果未登录,则拦截请求,直接 响应,禁止用户进入需要登录的页面。
- 网站维护公告,在所有路由的最上面定义接收所有请求的中间件,直接为客户端做出响应,网站正在维护中。
- 自定义404界面,当后台代码执行到最后没有匹配成功,返回404界面
//写在所有处理请求的中间件的最后
app.use(function(req, res, next){
res.status(404).send('404!!')
});
错误处理中间件-统一处理一些错误(只能处理同步错误代码)
在程序执行的过程中,不可避免的会出现一些无法预料的错误,比如文件读取失败,数据库连接失败。错误处理中间件是一个集中处理错误的地方。
app.use('/index',(req, res, next) => {
throw new Error('错误了!!')//模拟报错
});
app.use(function (err, req, res, next) {
res.status(500).send('500服务器错误');
});
对于异步的过程,当程序出现错误的时候,调用next方法,并且将错误信息通过参数的形式传递给next()方法,即可触发错误处理中间件
app.get("/",(req,res,next)=>{
fs.readFile("/file-does-nothexist",(err,data)=>{
if (!err) {
next(err);
}
});
});
异步函数 async await如何捕获错误,异步的api写成了同步的形式
使用try catch可以捕获异步函数以及其他同步代码在执行过程中发生的错误,但是不能捕获其他类型的API(异步api promise形式的)发生的错误
app.get("/",async(req,res,next)=>{
try {
await User.find({name:'张三'});//异步函数
}catch(err){
next(err);//将错误抛给了错误处理中间件
});
模块化构建路由,根据不同的请求设置路由
const express = require('express');
const app = express();
//创建路由对象
const home = express.Router();
// 为路由对象匹配请求路径,一级路由
app.use('/home',home);
//在二级路由当中处理请求 /home/index
// 在/home下面继续创建二级路由
home.get('/index',(req,res)=>{
res.send('index')
});
app.listen(3000);
模块化的开发
express中参数的获取
GET参数的获取
在express当中使用req.query来获取GET请求参数,框架内部会自动将GET请求参数转换为对象
POST参数的获取
const express = require('express');
const bodyParser = require('body-parser');
//创建网站服务器
const app = express();
//配置bodyParser请求,会将post请求的参数转成赋值对象给req.body的对象里面,然后调用next()方法将请求传递下去
//拦截所有的请求
app.use(bodyParser.urlencoded({
//false时使用queryString进行参数转对象,true时使用qs处理
extended: false
}));
//处理请求
app.post('/add', (req, res) => {
console.log(req.body);
});
app.listen(3000);
//监听端口
console.log("success")
express请求参数的设置
//访问localhost:3000/find/123,访问的时候必须要加上参数才可以正确匹配
//带的参数不需要加'id='
const express = require('express');
const bodyParser = require('body-parser');
//创建网站服务器
const app = express();
//处理请求
app.get('/find/:id/:name',(req,res) =>{
console.log(req.params);//{ id: '122', name: 'lize' }
res.send('ok');
});
app.listen(3000);
//监听端口
console.log("success");
静态资源的匹配
通过Express内置的express.static可以方便地托管静态文件,例如img、CSS、JavaScript文件等。
//使用app.use拦截所有的请求,调用express.static判断请求的静态资源是否在当下静态资源目录下面存在
//如果是的话,直接返回并中断这次的请求,即后续代码不在继续执行;如果不是的话,调用next方法
//将请求传递下去
app.use(express.static(静态资源目录));
例子
const express = require('express');
const path = require('path');
//创建网站服务器
const app = express();
//处理请求
//'/static是指定静态资源虚拟路径',访问的时候需要localhost:3000/static/image/01.jpg
app.use('/static',express.static(path.join(__dirname, '/image')));
app.listen(3000);
//监听端口
console.log("success");
模板引擎
为了使art-template模板引擎能够更好的和Express框架配合,模板引擎官方在原art-template模板引擎 的基础上封装了express-art-template。
使用npm install art-template express-art-template命令进行安装。
//当渲染后缀为art的模板时使用express-art-template
app.engine('html',require('express-art-template'));
//设置模板存放目录
app.set('views',path.join(__dirname,'views'));
//渲染模板时不写后缀默认拼接html后缀
app.set('view engine','html');
app.get('/', (req, res) => {
//渲染模板
//render作用
//1. 拼接模板路径 2. 拼接模板后缀 3. 哪一个模板和哪一个数据进行拼接 4. 将拼接的结果响应给客户端
res.render('index');
});
app.locals对象
将变量设置到app.locals对象下面,这个数据在所有的模板中都可以获取到。
app.locals.user = {
name: 'lize'
};
//在模板文件直接访问user即可访问到这个对象