node.js学习笔记-express框架

397 阅读6分钟

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即可访问到这个对象