(一)概述
Express是一个基于Node平台的web网页开发框架,它提供了一系列强大的特性,帮助你创建各种web应用。我们可以用npm install express命令下载它。
Express框架特性:
1 .提供了方便简洁的路由定义方式(router模块就是从express框架中抽取的)
2 .对获取http请求参数进行了简化处理
3 .对模板引擎支持程度高,方便渲染动态HTML页面
4 .提供了中间件机制,有效控制http请求
5 .拥有大量第三方中间件对功能进行扩展
(二)
1 .使用express框架搭建服务器不需要再引入http模块,我们可以直接调用框架的express方法,并创建路由
const express = require("express");
const app = express();
app.get("/", (req, res) => { res.send("ok") });
2 .使用send方法代替end对请求进行响应。
①send方法内部会自动检测响应内容的类型
②send方法会自动设置http状态码
(三)中间件
中间件就是一堆方法,可以接收客户端发来的请求,可以对请求做出响应,也可以将请求交给下一个中间件继续处理。
中间件由两部分构成,中间件方法以及请求处理函数。
中间件方法由express提供,用于拦截请求,请求处理函数由开发任意提供,负责处理请求。可以对同一个请求设置多个中间件,进行多次处理。默认情况下,请求从上到下依次匹配中间件,一旦匹配成功则终止匹配,如果需要继续往下匹配,则在回调函数中调用next方法。
const express = require("express");
const app = express();
app.get("/", (req, res, next) => { req.name = "ROSE"; next() });
app.get("/", (req, res) => { res.send( req.name ) });
app.listen(80);
2 .app.use中间件
app.use中间件可以不传递任何请求参数,也就说任何请求都会走这个中间件,前提是将这个中间件写在了所有中间件的最上方
app.use((req, res, next) => {
// 处理程序
next();
})
3 .中间件的实际应用
①路由保护,如用户在访问路由页面时,可以先使用中间件判断用户的登录状态,如果未登录则拦截请求,阻止用户访问需要登录的页面
②网站维护公告,在所有路由的最上面定义接收所有请求的中间件,直接为客户端做出响应
③自定义404页面,在所有路由的最后面定义中间件,如果用户请求的页面匹配不到所有路由,则返回404页面,使用res.status()来定义状态码
app.use((req, res) => {
res.status(404).send("请求的页面没有找到");
})
4 .错误处理中间件
错误处理中间件就是一个集中处理错误的地方,错误处理函数第一个形参为错误对象,错误对象的message属性包含了同步错误信息。
错误处理中间件只能捕获同步错误 异步错误请用next()方法传出,
next方法如果不加参数表示将处理交给下一个中间件,如果加参数则表示触发错误处理中间件
const fs = require("fs");
const express = require("express");
const app = express();
app.get("/", (req, res, next) => {
fs.readFile("错误目录", (err, doc) => {
if (err != null) {
next(err);
} else {
res.send(doc);
}
});
});
app.use((err, req, res) => {
res.status(500).send("当前发生未知错误");
});
app.listen(80);
(四)模块化路由
在实际开发中,将大量的路由写在同一页面的代码时难以维护的,我们可以用express提供的Router方法创建二级路由,并将不同的请求处理放置在不同的文件中,这就是模块化路由。
(五)express框架请求参数接收
1 .get请求参数
①在express框架中,使用req.query可以轻松获取get请求参数,并自动转换为对象格式
②get请求参数的另一种方式:
在书写路由代码时,可以给请求添加占位符,用冒号表示
server.use("/index/:id/:name", (req, res) => {
// 它表示用户在地址栏输入请求参数时,要匹配每一个占位符
// 获取此类get请求要用req.params
res.send(req.params);
})
比如要匹配以上路由,地址栏就要输入以下格式
localhost/index/xxx/xxx
2 .post请求参数
post请求参数的接收需要借助第三方包 body-parser
body-parser模块是express官方提供的从框架中抽取出去的模块,当需要使用此模块时,使用npm命令下载即可
1 . 引入body-parser模块
const bodyParser = require("body-parser");
2 .配置body-parser模块
①使用app.use中间件拦截所有请求
②调用bodyParser模块下的urlencoded方法对请求进行处理,urlencoded方法内部会检测是否包含请求参数,如果包含,会接收请求参数,并且将请求参数转换为对象类型,再对req对象添加body属性,最后在方法内部调用了next方法将请求控制器交给下一个中间件,我们就可以使用req.body获取post请求参数。
③在urlencoded方法中传递了一个extended参数,当extended值为false时,会自动调用querystring对请求参数进行处理,当值为true时,会调用QS的第三方模块对请求参数进行处理,QS在功能上要比querystring更加强大,这里我们用querystring已经足够了。
const bodyParser = require("body-parser");
app.use(bodyParser.urlencoded( { extended: false } ));
app.post("/add", (req, res) => {
res.send(req.body);
})
(六)静态资源处理
使用express内置的express.static可以相当方便的设置静态资源托管
调用use中间件拦截请求,直接调用express.static当作处理函数,并将静态资源目录当作参数传递进去,当然,路径还是选择绝对路径,是不是相当的方便
server.use(express.static(path.join(__dirname, "views")));
(七)express-art-template
(八)最后
Node.js 是前端工作人员转向后端开发的最快途径,也是前端的加分项,但不是必选项(当然这得看公司需求)。在其他前端知识还没有掌握扎实的情况下,学到这里也就够了,能够使用node搭建简易的服务,用来测试前端代码,也为Ajax技术的掌握提供基础。当前端技术掌握的足够扎实后,再来继续深入学习node.js