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