当前位置:网站首页>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>
边栏推荐
- OJ daily practice - find the first character that only appears once
- Array and string offset access syntax with curly braces is no longer support
- 考过HCIP依然转行失败,职业网工最看重的到底是什么
- KunlunDB查询优化(二)Project和Filter下推
- 周国华 读书随记
- 14. 最长公共前缀
- Is it safe to make an appointment to pay new debts? Is it reliable?
- OJ daily practice - delete word suffixes
- Programmers' choice of taking private jobs and part-time jobs
- 10 Super VIM plug-ins, I can't put them down
猜你喜欢

Introduction to database access tools

DCC888 :SSA (static single assignment form)

Asynchronous FIFO

弱电转职业网工难不难?华为售前工程师分享亲身经历

Customize multi-level list styles in word

Redis cache

KunlunDB备份和恢复

JSBridge

【STM32技巧】使用STM32 HAL库的硬件I2C驱动RX8025T实时时钟芯片

What does password security mean? What are the password security standard clauses in the ISO 2.0 policy?
随机推荐
在Word中自定义多级列表样式
2. interface (calculator)
Dip1000,1 of D
js读取剪切板的图片
OJ每日一练——过滤多余的空格
使用smart-doc自动生成接口文档
Webrtc series - 4connection sorting of network transmission
China Mobile's mobile phone users grow slowly, but strive for high profit 5g package users
PHP7.3报错undefined function simplexml_load_string()
获取鼠标移动的方向
Array and string offset access syntax with curly braces is no longer support
JSBridge
Asynchronous FIFO
Digital data was invited to participate in Nantong enterprise digital transformation Seminar
os.Args[1:]中命令行参数为空时,不执行内部语句
Do domestic mobile phones turn apples? It turned out that it was realized by 100 yuan machine and sharp price reduction
c# sqlsugar,hisql,freesql orm框架全方位性能测试对比 sqlserver 性能测试
Safe and reliable! Tianyi cloud data security management platform passed the evaluation
输出字符串中最长的单词
弱电转职业网工难不难?华为售前工程师分享亲身经历