Express学习笔记

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目录下)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值