当前位置:网站首页>Express、路由(Route)、Request对象、Response对象、中间件、EJS模板
Express、路由(Route)、Request对象、Response对象、中间件、EJS模板
2022-06-22 21:24:00 【半夜删你代码·】
Express
Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你快速创建各种 Web 和移动设备应用。
简单来说Express就是运行在node中的用来搭建服务器的模块。
Express的使用:
(1)下载
npm i express --save 安装express并添加到依赖项
(2)第一个服务器
//引入express模块 var express = require('express') //创建应用对象 var app = express() //配置静态资源 app.use(express.static('public')) //开启服务器,监听3000端口 app.listen(3000)
路由(Route)
路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。
路由是由一个 URI、HTTP 请求(GET、POST等)和若干个句柄组成的。
Route的定义:
我们可以将路由定义为三个部分:
第一部分:HTTP请求的方法(get或post)
第二部分:URI路径
第三部分: 回调函数
Route的实现
Express中提供了一系列函数,可以让我们很方便的实现路由:
app.<method>(path,callback)
语法解析:
method指的是HTTP请求方法,比如:
app.get()
app.post()
path指要通过回调函数来处理的URL地址
callback参数是应该处理该请求并把响应发回客户端的请求处理程序
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端口')
})
Route的运行流程
当Express服务器接收到一个HTTP请求时,它会查找已经为适当的HTTP方法和路径定义的路由
如果找到一个,Request和Response对象会被创建,并被传递给路由的回调函数
我们便可以通过Request对象读取请求,通过Response对象返回响应
Express中还提供了all()方法,可以处理两种请求。
Request对象
Request对象是路由回调函数中的第一个参数,代表了用户发送给服务器的请求信息
通过Request对象可以读取用户发送的请求包括URL地址中的查询字符串中的参数,和post请求的请求体中的参数。
Request对象属性和方法:
属性/方法 | 描述 |
request.query | 获取get请求查询字符串的参数,拿到的是一个对象 |
request.params | 获取get请求参数路由的参数,拿到的是一个对象 |
request.body | 获取post请求体,拿到的是一个对象(要借助一个中间件) |
request.get(xxxx) | 获取请求头中指定key对应的value |
Response对象
Response对象是路由回调函数中的第二个参数,代表了服务器发送给用户的响应信息。
通过Response对象可以设置响应报文中的各个内容,包括响应头和响应体。
Response对象的属性和方法:
属性/方法 | 描述 |
response.send() | 给浏览器做出一个响应 |
response.end() | 给浏览器做出一个响应(不会自动追加响应头) |
response.download() | 告诉浏览器下载一个文件 |
response.sendFile() | 给浏览器发送一个文件 |
response.redirect() | 重定向到一个新的地址(url) |
response.set(header,value) | 自定义响应头内容 |
res.status(code) | 设置响应状态码 |
中间件
Express 是一个自身功能极简,完全是由路由和中间件构成一个的 web 开发框架:从本质上来说,一个 Express 应用就是在调用各种中间件。
中间件(Middleware) 是一个函数,它可以访问请求对象(request), 响应对象(response), 和 web 应用中处于请求-响应循环流程中的中间件,一般被命名为 next 的变量。
中间件功能
- 执行任何代码。
- 修改请求和响应对象。
- 终结请求-响应循环。
- 调用堆栈中的下一个中间件。
中间件的分类
- 应用级中间件(过滤非法的请求,例如防盗链)
- 第三方中间件(通过npm下载的中间件,例如body-parser)
- 内置中间件(express内部封装好的中间件)
- 路由器中间件 (Router)
中间件实例
//引入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端口')
})
Router路由器
Router 是一个完整的中间件和路由系统,也可以看做是一个小型的app对象。
为什么使用Router? --为了更好的分类管理route
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
EJS模板
EJS是一个高效的 JavaScript 模板引擎。
模板引擎是为了使用户界面与业务数据(内容)分离而产生的。
简单来说,使用EJS模板引擎就能动态渲染数据。
EJS的使用:
1.下载安装
npm i ejs --save
2.配置模板引擎
app.set("view engine" , "ejs");
3.配置模板的存放目录
app.set("views","./views")
4.在views目录下创建模板文件
xxx.ejs
5.使用模板,通过response来渲染模板
response.render(‘模板名称’, 数据对象)
EJS语法
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>Hello EJS,这是我的第一个EJS</h1>
//<% code %> 执行其中的JS代码
<%
console.log("Hello EJS");
var a = 30;
%>
//<%=username%> 输出转义的数据到模板上
<h2>用户名 : <%=username%></h2>
//<%-username%> 输出非转义的数据到模板上
<h2>用户名 : <%-username%></h2>
//<% %> 可以包含JS代码与下面拼接在一起
<%
if(a==20){
%>
<h3>a的值是20</h3>
<%
}
%>
<%
for(var i=0 ; i<3 ; i++){
%>
<h3>老师真帅啊!!!!!</h3>
<%
}
%>
</body>
</html>
边栏推荐
猜你喜欢

考过HCIP依然转行失败,职业网工最看重的到底是什么

flutter外包,承接flutter项目

Enjoy high-performance computing! Here comes the Tianyi cloud HPC solution

Introduction to database access tools

JSBridge

KunlunDB备份和恢复

Php7.3 error undefined function simplexml_ load_ string()

c# sqlsugar,hisql,freesql orm框架全方位性能测试对比 sqlserver 性能测试

MySQL master-slave synchronization and its basic process of database and table division

MySQL8.0轻松完成GTID主从复制
随机推荐
js防止PC端复制正确的链接
MySQL master-slave synchronization and its basic process of database and table division
别再用 System.currentTimeMillis() 统计耗时了,太 Low,StopWatch 好用到爆!
Introduction to database access tools
13. 罗马数字转整数
Sword finger offer 05 Replace spaces
Leakcanary source code (2)
WebRTC系列-网络传输之4Connection排序
os. When the command line parameter in args[1:] is empty, the internal statement will not be executed
【Kubernetes 系列】Kubernetes 概述
flutter外包,承接flutter项目
tp5.1解决跨域
Dip1000,1 of D
Enjoy high-performance computing! Here comes the Tianyi cloud HPC solution
Synchronization circuit and cross clock domain circuit design 2 -- cross clock domain transmission (FIFO) of multi bit signals
程序员接私活兼职选择
Unity: use ray to detect objects
Ensure database and cache consistency
DCC888 :SSA (static single assignment form)
Is it difficult to turn weak current into professional network worker? Huawei pre-sales engineers share their own experience