express简介
以下介绍来自官网:
路由
定义如何处理浏览器的请求
- 例如app.get、app.post对应监听get、post请求,app.all监听所有http请求。
- 监听不同的路径,对指定路径进行处理。例如监听到'/login'进行登录处理,监听到'student_list',进行学生列表查询处理。
var express = require('express')
var app = express()
// respond with "hello world" when a GET request is made to the homepage
app.get('/', function (req, res) {
res.send('hello world')
})
开发中间件
Express是一个路由和中间件Web框架,其自身的功能很少,Express应用程序本质上是一系列中间件函数调用。
中间件的功能是可以访问请求对象(req
),响应对象(res
)和应用程序的请求-响应周期中的下一个中间件功能的功能。下一个中间件功能通常由名为的变量表示next
。
中间件功能可以执行以下任务:
- 执行任何代码。
- 更改请求和响应对象。
- 结束请求-响应周期。
- 调用堆栈中的下一个中间件函数。
如果当前的中间件功能没有结束请求-响应周期,则必须调用next()
将控制权传递给下一个中间件功能。否则,该请求将被挂起。
使用中间件
Express可以使用以下类型的中间件:
-
应用层中间件
通过app.use和app.method将应用层中间件绑定到express实例上,其中method是中间件处理的request请求的小写,例如get、post、put。 -
路由器级中间件
路由器级中间件与应用程序级中间件的工作方式相同,只不过它绑定到的实例express.Router()
。 -
错误处理中间件
与其他中间件函数相同的方式定义错误处理中间件函数,除了使用四个参数而不是三个参数(错误处理中间件始终采用四个参数。即使不需要使用该next
对象,也必须指定它以维护签名。否则,next
对象将被解释为常规中间件,并且将无法处理错误。) -
内置中间件
express内置:express.static、express.json、express.urlencoded -
第三方中间件
使用第三方中间件向Express应用程序添加功能
模板引擎
在运行期间,模板引擎将静态模板中的变量替换为运行期间产生的真实数据,并转换为html文件返回给客户端,这样使html的设计更加简单。
与Express配合使用的一些流行模板引擎是Pug,Mustache和EJS。Express默认使用Jade。
错误处理
Express带有默认的错误处理程序,不需要任何额外的工作。如果同步代码引发错误,则Express将捕获并处理该错误。例如:
app.get('/', function (req, res) {
throw new Error('BROKEN') // Express will catch this on its own.
})
Express新建服务器
在上一个章节中,分析了原生js书写一个简单的node服务器,非常的复杂麻烦。
使用express框架快速的构建一个上章节的Node服务。
新建html文件
<form action="http://localhost:8080/api" method="post" enctype="multipart/form-data">
用户:<input type="text" name="user"><br>
密码:<input type="password" name="pwd"><br>
<input type="file" name="file" multiple><br>
<input type="submit" value="提交">
</form>
处理静态文件
使用express内置中间件static,如下请求静态资源的时候express会从www寻找并返回
server.use(express.static('./www'));
处理post的body
安装body-parser
npm i body-parser -D
引入body-parser
插件,response的请求头中会自动新增body变量将body解析。
const body = require('body-parser'); //接收除文件外的body
server.use(body.urlencoded({extended: false}));
处理post上传的文件
安装multer
npm i multer -D
引入multer
插件,设置上传路径为./upload
,文件自动上传到upload目录,response的请求头中会新增files
变量存储相关信息。
const multer = require('multer'); // 接收文件body
let multerObj = multer({dest: './upload'});
server.use(multerObj.any());
完整代码
const express = require('express');
const body = require('body-parser'); //接收除文件外的body
const multer = require('multer'); // 接收文件body
let server = express();
server.listen(8080);
// 中间件,用use吧服务加到中间件上,每个中间件加的方式看官网定义
server.use(body.urlencoded({extended: false}));
let multerObj = multer({dest: './upload'});
server.use(multerObj.any());
// 处理请求
server.get('/', (req, res) => {
res.send('OK');
});
server.post('/api', (req, res) => {
res.send('OK');
// 原生和express都没有req.body,是中间件加上的body
console.log(req.body);
console.log(req.files);
});
// static,意思是请求静态资源的时候express会处理
server.use(express.static('./www'));
请求结果
- express对缓存已经做好了处理
再次访问
- body提交的数据只通过
req.body
就正确解析,req.files
里面包含了上传的文件信息,并且已经做好了文件名哈希。
- 去upload文件夹下检验,上传的文件确实存在,并且正确
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。