AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
1.1 Express框架是什么 Express是一个基于**Node平台**的**web应用开发框架**, 它提供了一系列的强大特性, 帮助你**创建各种Web应用**。 我们可以使**用`npm install express`命**令进行下载。 1.2 Express框架特性 ●提供了方便**简洁的路由定义**方式 ●对获取HTTP**请求参数**进行了**简化处理** ●对**模板引擎支持程度高**,方便渲染动态HTML页面 ●提供了**中间件**机制有效**控制HTTP请求** ●拥有大量第三方中间件对功能进行扩展 1.3原生Node.js与Express框架**对比**之**路由** ![](https://img.kancloud.cn/1b/53/1b5367ecaf71c506036e2600c915fd23_1252x559.png) Express 框架 实现代码 使**用`npm install express`命**令进行下载 app.js 下的文件代码 ~~~ //引入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('网站服务器启动成功'); ~~~ 2.1什么是中间件 中间件就是一堆方法, 可以接收客户端发来的请求、可以对请求做出响应,也可以将请求继续交给下一个中间件继续处理。 ![](https://img.kancloud.cn/43/b0/43b025648b16d8fdc09eb086f16eb489_1115x408.png) 中间件主要由两部分构成,**中间件方法**以及**请求处理函数**。 中间件方法由Express提供,负责拦截请求,请求处理函数由开发人员提供,负责处理请求。 ~~~ app.get('请求路径',' 处理函数')//接收并处理get请求 app.post('请求路径','处理函数') // 接收并处理post请求 ~~~ 可以针对同一一个请求设置多个中间件,对同一个请求进行多次处理。 默认情况下,请求从上到下依次匹配中间件,一旦 匹配成功,终止匹配。 可以调用**next方法**将请求的控制权**交给下一个中间件**,直到遇到**结束请求的中间件**。 (res.send 结束请求的中间件) ~~~ app.get('/request',(req, res, next) => { req.name = "张三” ; next(); }) ; app.get('/request',(req, res) => { res.send (req. name) ; }) ; ~~~ 2.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 () ; }) ; ~~~ 2.3中间件应用 1.路由保护,客户端在访问需要登录的页面时,可以先使用中间件判断用户登录状态,用户如果未登录,则拦截请求,直接响应,禁止用户进入需要登录的页面。 2.网站维护公告, 在所有路由的最上面定义接收所有请求的中间件,直接为客户端做出响应,网站正在维护中。 3.自定义404页面 1.路由保护,客户端在访问需要登录的页面时,可以先使用中间件判断用户登录状态,用户如果未登录,则拦截请求,直接响应,禁止用户进入需要登录的页面。 ![](https://img.kancloud.cn/9e/ee/9eeed0f048db02636efe711cac1c40e4_1024x778.png) 2.网站维护公告, 在所有路由的最上面定义接收所有请求的中间件,直接为客户端做出响应,网站正在维护中。 ![](https://img.kancloud.cn/bd/dc/bddc0988bc26aad22d5bcdaa638b6a9a_1089x826.png) 3.自定义404页面 ![](https://img.kancloud.cn/9c/7a/9c7abe4a50abb4ad36b2f80929db0304_1060x783.png) 2.4错误处理中间件 在程序执行的过程中,不可避免的会出现-些无法预料的错误,比如文件读取失败,数据库连接失败。 错误处理中间件是一个集中处理错误的地方。 ~~~ // 错误对象,请求对象,响应对象,给下一个权限对象 app.use((err, req, res, next) => { res. status(500) .send('服务器发生未知错误') ; }) ~~~ 当程序出现错误时,调用next()方法,并且将错误信息通过参数的形式传递给next()方法,即可触发错误处理中间件。 ~~~ 当程序出现错误时,调用next()方法,并且将错误信息通过参数的形式传递给next()方法,即可触发错误处理中间件。 app.get("/",(req, res, next) => { fs. readFile("/file-does-not-exist", (err, data) => { if(err) { next (err) ; } }) ; }) ; ~~~ 2.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) ; } }) ; ~~~ 代码实验 ![](https://img.kancloud.cn/b2/66/b266d6fc5076511c1f1b24c9c432fa27_788x769.png) 3. Express请求处理 3.1构建模块化路由 ~~~ const express = require('express' ) //创建路由对象 const home = express . Router () ; //将路由和请求路径进行匹配 app.use(' /home',home) ; //在home路由下继续创建路由 home.get('/ index', () => { // /home/index res.send('欢迎来到博客展示页面') ; }) ; ~~~ ![](https://img.kancloud.cn/c6/e0/c6e0608c8c608c7715eb645667ae1fac_495x120.png) 构建模块化路由 ![](https://img.kancloud.cn/a6/84/a6840c64ef2ca31a1b6670a8c03f0414_1048x488.png) 2.3 GET参数的获取 Express框架中使用**req.query**即可获取GET参数,框架内部会将GET参数转换为对象并返回。 ~~~ //接收地址栏中问号后面的参数 //例如: http://loca lhost :3000/ ?name=zhanqsan&age=30 app.get('/', (req, res) => { console. log (req.query) ; // {"name": "zhangsan", "age": "30"} }) ; ~~~ 2.4 POST参数的获取 Express中接收post请求参数需要借助第三方包body-parser. 在当前项目下下载`npm install body-parser` ~~~ //引入body-parser模块 const bodyParser = require('body-parser') ; //配置body-parser模块 app. use (bodyParser . urlencoded({ extended: false })) ; //接收请求 app.post(' /add',(req, res) => { //接收请求参数 ” 接收post请求参数 res . send(req . body) //将接受参数 显示在页面上 console . log (req. body) ; }) ~~~ 2.5 Express路由参数 ~~~ app.get('/ find/ :id', (req, res) => { }) ; localhost: 3000/find/123 ~~~ 2.6静态资源的处理 通过Express内置的**express.static**可以方便地托管静态文件,例如img、CSS、 JavaScript 文件等。 ~~~ app.use (express.static('public')) ; ~~~ 现在,public 目录下面的文件就可以访问了。 ●http://localhost:3000/images/kitten.jpg ●http://localhost:3000/css/style.css ●http://localhost:3000/js/appjs ●http://localhost:3000/images/bg.png ●http://localhost:3000/hello.html 模板引擎 ●为了使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('views', path.join(_ dirname, 'views')) ; //渲染模板时不写后缀默认拼接art后缀 app.set('view engine', 'art') ; app.get('/', (req, res) => { //渲染模板 res. render(' index') ; }) ; ~~~ ![](https://img.kancloud.cn/6e/be/6ebe627b67b4c96f70e79961ebc326f7_891x913.png) app.locals对象 所有模板都可以使用这个数据 ~~~ 将变量设置到app.locals对象下面,这个数据在所有的模板中都可以获取到。 app. locals.users = [{ name :"张三', age: 20 },{ name: '李四, age: 20 }] ~~~