目录
简介
Express 是一个基于 Node.js 的开源 Web 应用程序框架,用于简化和加速基于 Node.js 的 Web 开发流程。通俗点说:是封装好的工具包,封装了很多功能。express的作用和Node.js内置的HTTP模块类似,便于我们用来创建Web服务器。
初识express
由于express是一个包,可以通过npm安装。
// 导包
const express = require('express')
// 创建 Express 应用实例
const app = express()
// 路由
app.get('/',(req,res)=>{
res.end('learn express')
})
// 监听端口
app.listen(9000,()=>{
console.log('启动服务')
})
在浏览器中输入http://127.0.0.1:9000,输出learn express
express路由
Express 路由是 Express 框架中用于处理 HTTP 请求的核心部分。在 Express 中,路由指的是将客户端发起的不同类型的 HTTP 请求(如 GET、POST、PUT、DELETE 等)与特定的 URL 路径关联起来,并将它们映射到相应的处理函数上。这种映射关系使得服务器能够根据收到的请求类型和 URL 决定应该执行哪些操作或返回什么内容给客户端。
关键组成部分
请求方法
指 HTTP 协议中定义的各种操作类型,比如 GET(获取资源)、POST(新建资源或提交数据)、PUT(更新资源)、DELETE(删除资源)、PATCH(部分更新资源)等。在 Express 中,可以通过 app.method() 来指定请求的方法,如 app.get()、app.post() 等。
请求路径
指客户端发出请求所指向的服务器端的资源地址。它可以是一个静态路径(如 /users
)或者带有动态参数的路径(如 /users/:id
)。在后者中,:id
是一个占位符,可以捕获实际请求中的值。
回调函数
负责处理请求,并生成响应。它通常接受两个参数:request
(req)对象和 response
(res)对象,这两个对象包含了请求和响应相关的各种信息和方法,用于读取请求数据、设置响应头、发送响应内容等。
示例
// 导包
const express = require('express')
// 创建 Express 应用实例
const app = express()
// 路由
app.get('/user',(req,res)=>{
// 服务器明确告知客户端响应体采用的编码方式
res.setHeader('Content-Type', 'text/html; charset=utf-8');
// 浏览器输入http://127.0.0.1:9000/user ===> user 路由
res.end('user 路由')
})
app.get('/hello',(req,res)=>{
res.setHeader('Content-Type', 'text/html; charset=utf-8');
// 浏览器输入http://127.0.0.1:9000/ ===> hello 路由
res.end('hello 路由')
})
app.post('/reg',(req,res)=>{
res.setHeader('Content-Type', 'text/html; charset=utf-8');
res.end('post 请求')
})
//匹配所有方法
/*
app.all('/test',(req,res)=>{
res.setHeader('Content-Type', 'text/html; charset=utf-8');
res.end('post 请求')
})
*/
// 监听端口
app.listen(9000,()=>{
console.log('启动服务')
})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form method="post" action="http://127.0.0.1:9000/reg">
<button>点击</button>
</form>
</body>
</html>
关于post请求,这里新建一个html文件,在form标签中的action属性设置为http://127.0.0.1:9000/reg,当点击<点击>按钮时候,会向http://127.0.0.1:9000/reg发送post请求,页面跳转至http://127.0.0.1:9000/reg网页并且输出post请求。
获取报文参数
兼容原生操作
// 导包
const express = require('express')
// 创建 Express 应用实例
const app = express()
// 路由
app.get('/user',(req,res)=>{
//http://127.0.0.1:9000/user?a=2&b=3
console.log(req.path) // 获取路径 /user
console.log(req.query) // 获取查询字符串 { a: '2', b: '3' }
console.log(req.ip) // 获取ip ::ffff:127.0.0.1
console.log(req.get('host')) //获取请求头(host) 127.0.0.1:9000
res.end('yyy')
})
// 监听端口
app.listen(9000,()=>{
console.log('启动服务')
})
获取路由参数
// 导包
const express = require('express')
// 创建 Express 应用实例
const app = express()
// 路由
app.get('/:id',(req,res)=>{
// 获取URL路由参数
// http://127.0.0.1:9000/aaa
console.log(req.params.id) // aaa
res.end('yyy')
})
// 监听端口
app.listen(9000,()=>{
console.log('启动服务')
})
:id
是一个路由参数,它的特点是用冒号 (:
) 包围,表明它是一个动态部分,可以匹配任何字符串。当客户端向服务器发送 GET 请求至 /
路径后面跟任意字符串(例如 /aaa
)时,这个路由就会被触发。
路由参数练习
/*
const products1 = require('./products.json')
{
products: [
{ id: 1, name: 'Product A', price: 19.99 },
{ id: 2, name: 'Product B', price: 29.99 },
{ id: 3, name: 'Product C', price: 39.99 }
]
}
const {products} = require('./products.json')
[
{ id: 1, name: 'Product A', price: 19.99 },
{ id: 2, name: 'Product B', price: 29.99 },
{ id: 3, name: 'Product C', price: 39.99 }
]
*/
// 导包
const express = require('express')
const {products} = require('./products.json')
// 创建 Express 应用实例
const app = express()
// 路由
app.get('/product/:id',(req,res)=>{
let {id} = req.params
let result = products.find(item=>{
if(item.id === Number(id))
{
return true;
}
})
res.end(`
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
h2{
color: red;
}
</style>
</head>
<body>
<h2>${result.id}</h2>
<h2>${result.name}</h2>
<h2>${result.price}</h2>
</body>
</html>
`)
})
// 监听端口
app.listen(9000,()=>{
console.log('启动服务')
})
products.js数据如下:
{
"products": [
{
"id": 1,
"name": "Product A",
"price": 19.99
},
{
"id": 2,
"name": "Product B",
"price": 29.99
},
{
"id": 3,
"name": "Product C",
"price": 39.99
}
]
}
浏览器访问:http://127.0.0.1:9000/product/2 随着products/后的参数改变,会在页面呈现不同数据。
express设置响应
// 导包
const express = require('express')
// 创建 Express 应用实例
const app = express()
// 路由
app.get('/user',(req,res)=>{
// res.status(200)
// res.set('aa','bb')
// res.send('Express')
// res.status(200).set('aaa','bbb').send('express')
//跳转响应
//res.redirect('https://www.baidu.com')
//下载响应
//res.download(__dirname+'./products.json')
//json响应
res.json({
name:'李四',
age:10
})
})
// 监听端口
app.listen(9000,()=>{
console.log('启动服务')
})
express中间件
Express 中间件是 Express 框架中的一个重要组成部分,它是一种处理函数,能够参与到 HTTP 请求-响应生命周期的各个阶段。在请求到达最终的目的路由处理器之前,中间件函数有机会预先处理请求,或者在请求结束后进行后处理,还可以完全终止请求-响应循环并直接向客户端发送响应。
作用
使用函数封装公共操作,简化代码。
类型
全局组件件、路由中间件
全局中间件
// 导入 express
const express = require('express');
const fs = require('fs');
const path = require('path');
// 创建应用对象
const app = express();
// 声明中间件函数
function recordMiddleware(req, res, next){
// 获取 url 和 ip
let {url, ip} = req;
fs.appendFileSync(path.resolve(__dirname, './access.log'), `${url} ${ip}\r\n`);
// 调用 next
next();
}
// 使用中间件函数
app.use(recordMiddleware);
// 创建路由
app.get('/home', (req, res) => {
res.send('首页');
});
app.get('/admin', (req, res) => {
res.send('用户页');
});
app.all('*',(req, res) => {
res.send('<h1>404 Not Found</h1>')
})
//监听端口, 启动服务
app.listen(9000, () => {
console.log('服务已经启动')
})
access.log中的数据:
/admin ::ffff:127.0.0.1
/admin ::ffff:127.0.0.1
/home ::ffff:127.0.0.1
/text ::ffff:127.0.0.1
路由中间件
const express = require('express');
const app = express();
app.get('/home', (req, res) => {
res.send('首页');
});
let checkCodeMiddleware = (req, res, next) => {
//判断 URL 中是否 code 参数等于 520
if(req.query.code === '520'){
next();
}else{
res.send('错误');
}
}
app.get('/admin', checkCodeMiddleware, (req, res) => {
res.send('用户');
});
app.get('/setting', checkCodeMiddleware, (req, res) => {
res.send('设置页面');
});
app.all('*',(req, res) => {
res.send('<h1>404 Not Found</h1>')
})
//监听端口, 启动服务
app.listen(9000, () => {
console.log('服务已经启动, 端口 3000 正在监听中....')
})
静态资源中间件
Express 静态资源中间件主要用于提供静态文件服务,也就是将服务器上的某个目录作为静态资源目录,允许客户端通过HTTP请求直接访问这些静态文件,如HTML、CSS、JavaScript、图片等。在Express中,这个功能由内置的 express.static
中间件实现。使用 express.static
方法可以轻松地为应用程序设置静态文件目录
public/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="./css/index.css">
</head>
<body>
<h1>test</h1>
</body>
</html>
public/css/index.css
h1{
color: red;
}
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('首页');
});
// 静态资源中间件设置
app.use(express.static(__dirname + '/public'));
app.listen(9000, () => {
console.log('服务已经启动, 端口 3000 正在监听中....')
})
浏览器:http://127.0.0.1:9000/index.html,index.html中的内容就会在网页显示出来。
浏览器:http://127.0.0.1:9000/css/index.css,内容如下:
除了响应文件内容之外,这个中间件还自动帮我们设置资源的mime类型:
获取请求体数据
在 Express 框架中,要获取 POST、PUT 等请求的请求体数据,需要借助额外的中间件,因为 Express 本身并未提供内置的请求体解析功能。最常用的中间件是 body-parser
,它已经被广泛应用于处理 JSON、URL-encoded 表单数据等。
const express = require('express');
const bodyParser = require('body-parser')
const app = express();
// 解析 JSON 格式的请求体的中间件
// const jsonParser = bodyParser.json()
//创建一个解析器,用于解析 application/x-www-form-urlencoded 格式的请求体
const urlencodedParser = bodyParser.urlencoded({ extended: false })
app.get('/login', (req, res) => {
res.sendFile(__dirname + '/10.html');
});
app.post('/login', urlencodedParser, (req, res) => {
console.log(req.body);
res.send('获取用户的数据')
});
app.listen(9000, () => {
console.log('server is running...');
})
<form action="http://127.0.0.1:9000/login" method="POST">
<label for="username">Username:</label>
<input type="text" id="username" name="username">
<label for="password">Password:</label>
<input type="password" id="password" name="password">
<button type="submit">Login</button>
</form>
当输入账号密码后,[Object: null prototype] { username: 'hhhhhh', password: '123456' }
路由模块化
const router = require('../router/router')
const express = require('express')
const app = express()
app.use(router)
app.listen(9000,()=>{
console.log('启动')
})
const express = require('express')
const router = express.Router()
router.get('/user',(req,res)=>{
res.end('route module')
})
router.get('/search',(req,res)=>{
res.end('route search')
})
module.exports = router
模板引擎
实现了视图(用户界面)和业务逻辑的分离,增强了代码的可维护性和复用性。
ejs模板引擎
官网:https://ejs.co/
EJS(Embedded JavaScript)是一种轻量级的模板引擎,用于将JavaScript代码嵌入到HTML中,从而实现动态地生成HTML内容。EJS的主要用途是在服务器端通过合并预先定义的模板文件和数据对象来创建最终的HTML响应,这些响应随后会被发送到用户的浏览器上。EJS模板语法允许开发人员在HTML模板中使用JavaScript表达式、控制流语句(如条件判断、循环)和其他JavaScript功能来操纵和展示数据。在Node.js环境尤其是与Express框架配合时,EJS非常流行,因为它可以让开发者以简单直观的方
基本工作原理
使用<% %>包裹JavaScript代码;
使用<%= %>输出JavaScript表达式的值,即自动转义后输出到HTML;
还有一些其他高级特性,例如局部变量定义、包含其他模板文件等。
安装
npm i ejs --save
初体验
const ejs = require('ejs');
const fs = require('fs');
let bb = '宝贝';
let str = `我爱你 ${bb}`
console.log(str) // 我爱你宝贝
let china = '中国'
let resule = ejs.render('我爱你<%= china %>',{china:china})
console.log(resule) //我爱你中国
将下面内容单独放在01.html文件中
我爱你 <%= china %>
const ejs = require('ejs');
const fs = require('fs');
let str = fs.readFileSync('./01.html').toString()
let china = '中国'
let resule = ejs.render(str,{china:china})
console.log(resule) //我爱你中国
可以在01.html文件中添加HtML标签等等操作
express框架使用ejs
// 导入 express
const express = require('express');
// 导入 path
const path = require('path');
// 创建应用对象
const app = express();
// 设置模板引擎
app.set('view engine', 'ejs'); // 除了ejs之外,还有很多模板引擎
// 设置模板文件存放位置 模板文件: 具有模板语法内容的文件
app.set('views', path.resolve(__dirname, './views'));
//创建路由
app.get('/home', (req, res) => {
// res.render('模板的文件名', '数据');
let title = '天天向上';
res.render('user', {title});
// 创建模板文件,在views所在的文件夹中 user.ejs
});
//监听端口, 启动服务
app.listen(3000, () => {
console.log('服务已经启动, 端口 3000 正在监听中....')
})
express-generator
能够帮助开发者快速初始化一个新的Express应用程序结构,生成一个基础的项目目录结构,包括基本的文件和目录,如app.js(主入口文件)、routes目录、public和views目录等。使用这个工具,开发者不必从零开始搭建整个项目的文件体系,节省了时间和精力。
安装
npm install -g express-generator
添加ejs模板引擎(后面可以跟项目文件夹)
express -e
接着可以安装依赖
npm i
运行:参考package.json中的scripts属性
npm start