Node Express框架

1.概述

Express是一个基于Node平台的web应用开发框架,它提供了一系列强大的特性,帮助创建各种web应用。
下载方式:npm install express

2.特性

  • 提供了方便简洁的路由定义方式
  • 对获取http请求参数进行了简化处理
  • 对模板引擎支持成都高,方便渲染动态html页面
  • 提供了中间件机制有效控制http请求
  • 拥有大量第三方中间件对功能进行扩展

3.express框架入门

//引入express框架
const express = require('express');
//创建服务器
const app = express();
app.get('/', (req, res) => {
    //send()
    //1.send方法内部会自动检测响应内容的类型
    //2.send方法内部会自动设置http状态码
    //3.send方法会帮助我们自动设置相应内容类型和编码
    res.send('hello.express');
});
app.get('/list',(req,res)=>{
   res.send({name:'张三',age:20});
});

app.listen(3000);
console.log('网站服务器启动成功')

4.中间件

4.1 get.post中间件

中间件就是一堆方法,可以接收客户端发来的请求,可以对请求做出响应,也可以将请求继续交给下一个中间件继续处理
可以针对同一个请求设置多个中间件,对同一个请求进行多次处理。
默认情况下,请求从上到下一次匹配中间件,一旦匹配成功终止匹配。
可以调用next方法将请求的控制权交给下一个中间件,知道遇到结束请求的中间件。

//引入express框架
const express = require('express');
//创建服务器
const app = express();
app.get('/request', (req, res, next) => {
    req.name = '张三';
    next();
});
app.get('/request', (req, res) => {
    res.send(req.name);
});
app.listen(3000);
console.log('网站服务器启动成功')
4.2 app.user中间件

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

//引入express框架
const express = require('express');
//创建服务器
const app = express();
//接受所有请求
app.use((req, res, next) => {
    console.log('请求走了app.use中间件');
    next();
});
//当访问request 接受请求
app.use('/request',(req, res, next) => {
    console.log('请求走了app.use/request中间件');
    next();
});
app.use('/list',(req,res,next)=>{
    res.send('list');
})
app.get('/request', (req, res, next) => {
    req.name = '张三';
    next();
});
app.get('/request', (req, res) => {
    res.send(req.name);
});
app.listen(3000);
console.log('网站服务器启动成功')
4.3 中间间应用
  • 路由保护,登录拦截跳转
  • 网站维护公告
  • 自定义404页面
//引入express框架
const express = require('express');
//创建服务器
const app = express();
//网站公告
// app.use((req, res, next) => {
//     res.send('网站正在维护');
// });
//网站登录
app.use('/admin', (req, res, next) => {
    let isLogin = true;
    if (isLogin) {
        next();
    } else {
        res.send('你还没有登录,不能访问admin这个页面');
    }
});

app.get('/admin', (req, res) => {
    res.status(200).send('你已经登录,可以访问当前页面');
});
//当前客户端相应404
app.use((req,res,next)=>{
    res.status(404).send('当前访问的页面是不存在的');
});
app.listen(3000);
console.log('网站服务器启动成功')//引入express框架
const express = require('express');
//创建服务器
const app = express();
//网站公告
// app.use((req, res, next) => {
//     res.send('网站正在维护');
// });
//网站登录
app.use('/admin', (req, res, next) => {
    let isLogin = true;
    if (isLogin) {
        next();
    } else {
        res.send('你还没有登录,不能访问admin这个页面');
    }
});

app.get('/admin', (req, res) => {
    res.status(200).send('你已经登录,可以访问当前页面');
});
//当前客户端相应404
app.use((req,res,next)=>{
    res.status(404).send('当前访问的页面是不存在的');
});
app.listen(3000);
console.log('网站服务器启动成功')
4.4错误处理中间件

在程序执行的过程中,不可避免的会出现一些无法预料的错误,比如文件读取失败,数据库连接失败,错误处理中间件是一个集中处理错我的地方
当程序出现场错误后,在调用next方法,并将错误信息通过参数传递给next()方法,即可触发错误处理中间件

//引入express框架
const express = require('express');
const fs = require('fs');
//创建服务器
const app = express();
app.get('/index', (req, res, next) => {
    // throw new Error('服务器发生未知错误');
    fs.readFile('./文件清单.txt', 'utf8', (err, result) => {
        if (err != null) {
            next(err);
        } else {
            res.send(result);
        }
    });
    // res.send('程序正常执行');
});
//错误处理中间件四个参数
app.use((err, req, res, next) => {
    res.status(500).send(err.message);
});
app.listen(3000);
console.log('网站服务器启动成功')
4.5 捕获错误

在node.js中,异步api的错误信息都是通过回调函数获取的,支持Promise对象的异步api发生错误可通过catch方法捕获,异步函数执行如果发生错误要如何捕获错误呢?
tyr catch可以捕获异步函数几其同步代码在执行过程中发生的错误,但是不能捕获其他类型的api发生从错误

//引入express框架
const express = require('express');
const fs = require('fs');
const promisify = require('util').promisify;
const readFile = promisify(fs.readFile);
//创建服务器
const app = express();
app.get('/index', async (req, res, next) => {
    try {
        await readFile('./aaa.js')
    } catch (e) {
        next(e);
    }
});
//错误处理中间件四个参数
app.use((err, req, res, next) => {
    res.status(500).send(err.message);
});
app.listen(3000);
console.log('网站服务器启动成功')

5.Express请求处理

5.1构建模块化路由

app.js

const express = require('express');
const app = express();
//创建路由对象
const home = express.Router();
//为路由对象匹配请求对象
app.use('/home', home);
//创建二级路由
home.get('/index', (req, res) => {
    res.send('欢迎来到博客首页');
});
app.listen(3000);

home.js

const express = require('express');
const home = express.Router();
home.get('/index', (req, res) => {
    res.send('欢迎来到首页');
});
module.exports = home;

index.js

const express = require('express');
const admin = express.Router();
admin.get('/index', (req, res) => {
    res.send('欢迎来到管理页面');
});
module.exports = admin;
5.2 GET参数的获取

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

const express = require('express');
const app = express();
app.get('/index', (req, res) => {
    //获取请求参数    ?name=ithedan&age=30
    res.send(req.query);//{'name':'ithedan','age':''30}
});
app.listen(3000);
5.3 POST参数的获取

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

const express = require('express');
const app = express();
//获取post 请求参数  需要用到三方模块body-parser
const bodyParser = require('body-parser');
//配置body-parser模板
//extended:false  方法内部使用queyrstring模块处理参数的格式
//extended:true  方法内部使用第三方模块qs处理请求参数的格式
app.use(bodyParser.urlencoded({extended: false}));
app.post('/add', (req, res) => {
    res.send(req.body);
});
app.listen(3000);
5.4 Express路由参数
const express = require('express');
const app = express();
app.get('/index/:id/:name/:age', (req, res) => {
    res.send(req.params);
    //{"id": "21", "name": "ithedan", "age": "32" }
});
app.listen(3000);
localhost:3000/index/21/ithedan/32
5.5 静态资源的处理

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

const express = require('express');
const app = express();
const path = require('path');
//实现静态资源访问功能  static虚拟路径  localhost:3000/static/----
// app.use('/static',express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));
app.listen(3000);
http://localhost:3000/css/style.css

6 express-art template 模板引擎

  • 为了是art-template模板引擎能够更好的和express框架配合,模板引擎官方在元art-template模板引擎的基础上封装了express-art-template
  • 使用 npm install art-template express-art-template
const express = require('express');
const app = express();
const path = require('path');
//当渲染后缀为art的模板时,使用express-art-template
app.engine('art', require('express-art-template'));
//设置模板目录
app.set('views', path.join(__dirname, 'views'));
//设置默认后缀
app.set('view engine', 'art');

//模板中可以获取到
app.locals.users = [{
    name: '张三',
    age: 18
}, {
    name: '李四',
    age: 18
}, {
    name: '王五',
    age: 18
},]

app.get('/index', (req, res) => {
    //1 拼接模板路径
    //2 拼接模板后缀
    //3 哪一个模板和哪一个数据进行拼接
    //4 将拼接结果反馈给客户端
    res.render('index', {
        msg: 'message'
    });
});

app.get('/list', (req, res) => {
    res.render('list', {
        msg: 'list page'
    })
});
app.listen(3000);

7。 项目案例初始化

7.1. 建立项目所需文件夹

public 静态资源
model 数据库操作
route 路由
views 模板

7.2. 初始化项目描述文件

npm init -y

7.3. 下载项目所需第三方模块

npm install express mongoose art-template express-art-template

7.4. 创建网站服务器
//引入express模块创建服务器
const express = require('express');
const app = express();
//引入路由模块
const home = require('./route/home');
const admin = require('./route/admin');
//引入express-session
const session = require('express-session');
//引入数据库
require('./model/connect');
//引入path模块用了操作路径
const path = require('path');
//引入body-parser 用来处理post请求参数
const bodyParser = require('body-parser');
//引入art-template
const template = require('art-template');
//引入dateformat模块用来处理日期
const dateFormat = require('dateformat');
//配置session
app.use(session({
    secret: 'cookie_secret',
    resave: true,
    saveUninitialized: true
}));
//告诉express 框架模板所在的位置
app.set('views', path.join(__dirname, 'views'));
//告诉express 模板默认后缀
app.set('view engine', 'art');
//当渲染后缀为art的模板时,所使用的模板引擎是什么
app.engine('art', require('express-art-template'));
//开放静态资源文件
app.use(express.static(path.join(__dirname, 'public')));
//处理post请求参数
app.use(bodyParser.urlencoded({extended: false}));
//登录拦截
app.use('/admin', require('./middleware/loginGuard'));
//关联路由模块 为路由匹配路径
app.use('/home', home);
app.use('/admin', admin);
//错误处理中间件
app.use((err, req, res, next) => {
    console.log(err.message)
    //将字符串对象转换为对象类型
    const result = JSON.parse(err);
    const params = [];
    for (let attr in result) {
        if (attr != 'path') {
            params.push(attr + "=" + result[attr]);
        }
    }
    return res.redirect(`${result.path}?${params.join('&')}`);
});
//向模板内部导入dateFormat变量
template.defaults.imports.dateFormat = dateFormat;

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

推荐阅读更多精彩内容