【Web全栈课程8】express实现node服务器

小叶子

express简介

以下介绍来自官网:

路由

定义如何处理浏览器的请求

  1. 例如app.get、app.post对应监听get、post请求,app.all监听所有http请求。
  2. 监听不同的路径,对指定路径进行处理。例如监听到'/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()将控制权传递给下一个中间件功能。否则,该请求将被挂起。
image.png

使用中间件

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'));

请求结果

  1. express对缓存已经做好了处理
    image.png
    再次访问
    image.png
  2. body提交的数据只通过req.body就正确解析,req.files里面包含了上传的文件信息,并且已经做好了文件名哈希。
    image.png
  3. 去upload文件夹下检验,上传的文件确实存在,并且正确
    image.png
阅读 661

一只萌萌的程序媛妹子,踏入前端领域不久,希望大家多指导,欢迎大家多多指出问题

69 声望
11 粉丝
0 条评论
你知道吗?

一只萌萌的程序媛妹子,踏入前端领域不久,希望大家多指导,欢迎大家多多指出问题

69 声望
11 粉丝
宣传栏