Express框架

Express框架

一、Express框架简介及初体验

1.express框架是一个基于node平台的web应用开发框架。

npm install express 命令进行下载。

2.express框架特性

提供了方便简洁的路由定义方式

对获取Http请求参数进行了简化处理

对模具引擎支持程度高,方便渲染动态HTML页面

提供了中间件机制有效控制Http请求

拥有大量第三方中间件对功能进行扩展

3.原生node.js和express框架对比之路由

原生

app.on('request',(req,res) => {

    //获取客户端的请求路径

    let {pathname} =url.parse(req.url);

    if(pathname == '/' || pathname == '/index') {

        res.end('欢迎来到首页');

    } else if ( pathname == '/list') {

        res.end('欢迎来到列表页');

    } else {

        red.end('抱歉,您访问的页面出游了');

    }

});

Express框架路由

app.get('/',(req,res) => {

    //对客户端做出响应

    res.send('Hello Express');

});

//当客户端以post方式访问/add路由时

app.post('/add', (req,res) => {

    res.send('使用post方式请求了/add路由');

});

4.原生node.js与express框架对比之获取请求参数

原生

express

app.get('/', (req,res) => {

    //获取GET参数

    console.log(req.query);

});

app.post('/', (req,res) => {

  //获取POST参数

  console.log(req.body);

});

5.express初体验

6.使用express框架创建web服务器及其简单,调用express模块返回的函数即可。

//引入express框架

const express = require('express');

//使用框架创建web服务器

const app = express();

//当客户端以get方式访问/路由时

app.get('/',(req,res) => {

  //对客户端做出响应send方法会根据内容的类型自动设置请求头

    res.send('hello express');

  //<h2>hello express</h2> {say: 'hello'}

});

//程序监听3000端口

app.listen(3000);

二、中间件

1.中间件:一堆方法,可以接收客户端发来的请求,可以对请求做出响应,也可以将请求继续交给下一个中间件继续处理。

中间件主要由两部分组成,中间件方法以及请求处理函数。

中间件方法由express提供,负责拦截请求,请求处理函数由开发人员提供,负责处理请求。

app.get('请求路径','处理函数')  //接收并处理get请求

app.post('请求路径','处理函数')  //接收并处理post请求

可以针对同一个请求设置多个中间件,对同一个请求进行多次处理。

默认情况下,请求从上到下依次匹配中间件,一旦匹配成功,终止匹配。

可以调用next方法将请求的控制权交给下一个中间件,直到遇到结束请求的中间件。

app.get('/request',(req,res,next) => {

    req.name = "张三";

    next();

});

app.get('/request',(req,res) => {

    res.send(req.name);

});

2. app.use中间件用法

app.use匹配所有的请求方式,可以直接传入请求处理函数,代表接收所有的请求。

app.use((req,res,next) => {

    console.log(req.url);

    next();

});

app.use第一个参数也可以传入请求地址,代表不论什么请求方式,只要是这个请求地址就接受这个请求。

app.use('/admin',(req,res,next) => {

    console.log(req.url);

    next();

});

3.中间件应用

路由保护,客户端在访问需要登录的页面时,可以先使用中间件判断用户登录状态,用户如果未登录,则拦截请求,直接响应,禁止用户进入需要登录的页面。

网站维护公告,在所有路由的最上面定义接收所有请求的中间件,直接为客户端做出响应,网站正在维护中。

自定义404页面。

4.错误处理中间件

在程序执行的过程中,不可避免的会出现一些无法预料的错误,比如文件读取失败,数据库连接失败。

错误处理中间件是一个集中处理错误的地方。

app.use((err,req,res,next) => {

    res.status(500).send('服务器发生未知错误');

})

当程序出现错误时,调用next()方法,并且将错误信息通过参数的形式传递给next()方法,即可触发错误处理中间件。

app.get("/",(req,res,next) => {

    fs.readFile("/file-does-not-exist",(err,data) => {

        if(err) {

          next(err);

        }

    });

});

5.捕获错误

在node.js中,异步api的错误信息都是通过回调函数获取的,支持Promise对象的异步api发生错误可以通过catch方法捕获。

异步函数执行如果发生错误要如何捕获错误呢。

try catch 可以捕获异步函数以及其他同步代码在执行过程中发生的错误,但是不能其他类型的api发生的错误。

app.get("/",async (req,res,next) => {

    try {

          await User.find({name : '张三'})

    }catch(ex) { 

        next(ex);

    }

});

三、Express 框架请求处理

1.构建模块化路由

const express = require('express');

//创建路由对象

const home = express.Router();

//将路由和请求路径进行匹配

app.use('/home',home);

//在home路由下继续创建路由

home.get('/index',() => {

    //  /home/index

    res.send('欢迎来到博客展示页面');

});

2.构建模块化路由

//home.js

const home = express.Router();

home.get('/index',()=>{

    res.send('欢迎来到博客展示页面');

});

module.exports = home;

//admin.js

const admin = express.Router();

admin.get('/index',() => {

    res.send('欢迎来到博客管理页面');

});

module.exports = admin;

//app.js

const home = require('./router/home.js');

const admin = require('./router/admin.js');

app.use('/home',home);

app.use('/admin',admin);

3.GET参数获取

Express框架中使用req.query即可获取GET参数。框架内部会将GET参数转换为对象并返回。

//接收地址栏中问号后面的参数

//http://localhost:3000/?name=zhangsan&age=18

app.get('/',(req,res) => {

  console.log(req.query);//{'name' : 'zhangsan', 'age' : '18'}

});

4.POST参数获取

Express中接收post请求参数需要借助第三方包body-parser。

//引入body-parser模块

const bodyParser = require('body-parset');

//配置body-parser模块

app.use(bodyParser.urlencoded({ extended : false}));

//接收请求

app.post('/add',(req,res) => {

    console.log(req.body);

});

5.Express路由参数

app.get('/find/:id',(req,res) =>{ 

    console.log(req.params);  //{id:123}

});

localhost:3000/find/123

6.静态资源的处理

通过Express内置的express.static可以方便地托管静态文件,例如img,css,js文件等。

app.use(express.static('public'));

现在,public目录下面的文件就可以访问了。

http://localhost:3000/images/kitten.jpg

http://localhost:3000/css/style.css

http://localhost:3000/js/app.js

http://localhost:3000/images/bg.png

http://localhost:3000/hello.html

四、express-art-template模块引擎

1.模块引擎

为了是art-template模块引擎能够更好的和express框架配合,模板引擎官方在原art-template模块引擎的基础上封装了express-art-template.

使用npm install art-template express-art-template命令进行安装。

//当渲染后缀为art的模板引擎时,使用express-art-template

app.engine('art',require('express-art-template'));

//设置模板存放目录

app.set('view',path.join(__dirname,'view'));

//渲染模板时不写后缀默认拼接art后缀

app.set('view engine','art');

app.get('/',(req,res) => {

    //渲染模板

    res.render('index');

});

2. app.locals对象

将变量设置到app.locals对象里面,这个数据在所有的模板中都可以获取到。

app.locals.user = [{

    name : 'ls',

    age : 18

},{

    name : 'lc',

    age : 19

}]

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335