Express框架的应用

235 阅读6分钟

Express简介

1.1 Express是什么

Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你快速创建各种 Web 和移动设备应用。

简单来说Express就是运行在node中的用来搭建服务器的模块。

1.2 Express的使用

1.2.1 下载

npm i express --save   安装express并添加到依赖项

//引入expres 模块
var express = require( 'express')\
/创建应用对象\
var app =express()
//配置静态资源
app.use(express.static( 'public' ))
//开启服务器,监听3000端口\
app.listen(3000)

2.1 Route是什么

路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。

路由是由一个 URI、HTTP 请求(GET、POST等)和若干个句柄组成的。

2.2 Route的定义

我们可以将路由定义为三个部分:

第一部分:HTTP请求的方法(get或post)

第二部分:URI路径

第三部分: 回调函数

2.3 Route的实现

Express中提供了一系列函数,可以让我们很方便的实现路由: app.(path,callback)

语法解析:

method指的是HTTP请求方法,比如:

app.get()

app.post()

path指要通过回调函数来处理的URL地址

callback参数是应该处理该请求并把响应发回客户端的请求处理程序

2.4 Route的实例

// 引入 express*
var express = require( 'express' )
// 创建应用对象

var app = express()
// 配置路由

app.get( '/index' , function (request, response) {
console.log( ' 路由 index 收到 get 请求 ' )
response.send( ' 这里是路由返回的信息, /hello 收到了 get 请求 ' )
})

app.post( '/index' , function (request, response) {
console.log( ' 路由 index 收到 post 请求 ' )
response.send( ' 这里是路由返回的信息, /hello 收到了 post 请求 ' )
})

// 启动服务器

*app.listen(3000, function () {
console.log( ' 服务器启动成功,监听 3000 端口 ' )
})

2.5 Route的运行流程

当Express服务器接收到一个HTTP请求时,它会查找已经为适当的HTTP方法和路径定义的路由

如果找到一个,Request和Response对象会被创建,并被传递给路由的回调函数 我们便可以通过Request对象读取请求,通过Response对象返回响应

Express中还提供了all()方法,可以处理两种请求。

2.6 Request对象****

2.6.1 Request对象是什么****

Request对象是路由回调函数中的第一个参数,代表了用户发送给服务器的请求信息

通过Request对象可以读取用户发送的请求包括URL地址中的查询字符串中的参数,和post请求的请求体中的参数。

2.6.2 Request对象属性和方法****

属性/方法描述
request.query****获取get请求查询字符串的参数,拿到的是一个对象****
request.params获取get请求参数路由的参数,拿到的是一个对象
request.body获取post请求体,拿到的是一个对象(要借助一个中间件)
request.get(xxxx)获取请求头中指定key对应的value

2.7 Response对象

2.7.1Response对象是什么

Response对象是路由回调函数中的第二个参数,代表了服务器发送给用户的响应信息。

通过Response对象可以设置响应报文中的各个内容,包括响应头和响应体。

2.7.2 Response对象的属性和方法****

属性/方法描述
response.send()给浏览器做出一个响应
response.end()给浏览器做出一个响应(不会自动追加响应头)
response.download()告诉浏览器下载一个文件
response.sendFile()给浏览器发送一个文件
response.redirect()重定向到一个新的地址(url)
response.set(header,value)自定义响应头内容
res.status(code)设置响应状态码

3.1中间件简介****

Express 是一个自身功能极简,完全是由路由和中间件构成一个的 web 开发框架:从本质上来说,一个 Express 应用就是在调用各种中间件。

中间件(Middleware) 是一个函数,它可以访问请求对象(request), 响应对象(response), 和 web 应用中处于请求-响应循环流程中的中间件,一般被命名为 next 的变量。

3.2中间件功能

1) 执行任何代码。

2) 修改请求和响应对象。

3) 终结请求-响应循环。

4) 调用堆栈中的下一个中间件。

3.3 中间件的分类****

1) 应用级中间件(过滤非法的请求,例如防盗链)

2) 第三方中间件(通过npm下载的中间件,例如body-parser)

3) 内置中间件(express内部封装好的中间件)

4) 路由器中间件 (Router)

3.4中间件实例

// 引入 express*
var express = require( 'express' )
// 创建应用对象

var app = express()
// 配置静态资源

app.use(express.static( 'public' ))
// 中间件,没有挂载路径,应用的每个请求都会执行该中间件

app.use(function (req, res, next) {
console.log( ' 这是中间件的响应 ~~~' )
// 如果不调用 next 方法,下面路由将不起作用

**next()
})
// 配置路由

app.get( '/index' , function (req, res) {
console.log( ' 路由 index 收到 get 请求 ' )
res.send( ' 这里是路由返回的信息, /hello 收到了 get 请求 ' )
}) app.post( '/index' , function (req, res) {
console.log( ' 路由 index 收到 post 请求 ' )
res.send( ' 这里是路由返回的信息, /hello 收到了 post 请求 ' )
})

// 启动服务器

*app.listen(3000, function () {
console.log( ' 服务器启动成功,监听 3000 端口 ' )
})

4.1 Router是什么

Router 是一个完整的中间件和路由系统,也可以看做是一个小型的app对象。

4.2 为什么使用Router

为了更好的分类管理route

4.3 Router的使用

// 引入 express 模块*
var express = require( 'express' );
// 引入 body-parser 模块

var bodyParser = require( 'body-parser' );
// 引入 Users 模型对象 var Users = require( '../models/Users' );
// 创建 router 对象

var router = express.Router();
// 解析请求体,将参数挂在到 req.body

*router.use(bodyParser.urlencoded({extended: false}));
router.post( '/login' , function (req, res) {
var username = req.body.username;
var password = req.body.password;
Users.findOne({username: username}, function (err, data) {
if (!err && data && data.password === password) {
res.send( ' 恭喜您登录成功 ~~~' );
} else {
res.send( ' 用户名或密码错误 ~~~' );
}
})
})

router.post( '/regist' , function (req, res) {
// 获取用户提交的参数*
*var username = req.body.username;
var password = req.body.password;
var rePassword = req.body.rePassword;
var email = req.body.email;
/

*1. 正则验证 *(-)**
2. 密码和确认密码是否一致
3. 去数据库中查找有无此用户名 4. 插入数据
*/
// 判断密码和确认密码是否一致
*if (password !== rePassword) {
res.send( ' 两次密码输入不一致,请重新输入 ~~' );
return

******}

// 去数据库中查找有无此用户名*
*Users.findOne({username: username}, function (err, data) {
if (!err) {
/

data
**如果查到了  返回文档对象
如果没找到  返回 null
*/
**if (data) {
// 查到了指定用户名

**res.send(data.username + ' 用户名已被注册 ~~ 请重新输入 ' );
} else {
// 没有找到指定有户名,将用户信息插入到数据库中

**Users.create({
username: username,
password: password,
email: email
}, function (err) {
if (!err) {res.send( ' 恭喜您,注册成功了 ~~' );
} else {
res.send( 'error' );
}
})
}
} else {
res.send( 'error' );
}
})
})
// 暴露路由器对象

*module.exports = router