express框架的基本使用
express框架的基本使用
1、express介绍
express是基于Node.js平台的极简、灵活的WEB应用开发框架。简单来说,express就是一个封装好的工具包,封装了很多功能,便于开发WEB应用(HTTP服务)
2、express使用
2.1、express下载
npm i express
// 导入const express = require("express");// 创建应用对象const app = express();// 创建路由app.get("/home", (req, res) => { res.end("hello express");});app.listen(9000, () => { console.log("端口监听中...");});
2.2、express路由
一个路由有三个部分组成,请求方法、路径和回调函数。
【资料图】
// 导入const express = require("express");// 创建应用对象const app = express();// 创建路由app.get("/home", (req, res) => { res.end("hello express");});app.get("/", (req, res) => { res.end("home");});app.post("/login", (req, res) => { res.end("test");});app.all("/test", (req, res) => { res.end("all test");});// 404响应,上面没有一个匹配就走这个路由app.all("*", (req, res) => { res.end("404");});app.listen(9000, () => { console.log("端口监听中...");});
2.3、获取请求报文参数
// 导入const express = require("express");// 创建应用对象const app = express();// 创建路由app.get("/request", (req, res) => { // 原生操作 console.log(req.method); console.log(req.url); console.log(req.httpVersion); console.log(req.headers); // express操作 console.log(req.path); console.log(req.query); // 获取ip console.log(req.ip); // 获取请求头 console.log(req.get("host"));});app.listen(9000, () => { console.log("端口监听中...");});
2.4、获取路由参数
// 导入const express = require("express");// 创建应用对象const app = express();// 创建路由app.get("/:id.html", (req, res) => { // 获取URL路由参数 console.log(req.params.id);});app.listen(9000, () => { console.log("端口监听中...");});
2.5、响应设置
express封装了一些API方便给客户端响应数据,并且兼容原生HTTP模块的获取方式。
// 导入const express = require("express");// 创建应用对象const app = express();// 创建路由app.get("/response", (req, res) => { // 1、express中设置响应的方式兼容HTTP模块的方式 res.statusCode = 404; res.statusMessage = "xxx"; res.setHeader("abc","xyz"); res.write("响应体"); res.end("xxx"); // 2、express的响应方法 res.status(500); res.set("xxx", "yyy"); // 设置响应头 res.send("xxx"); // 设置响应体 // 连贯操作 res.status(404).set().send() // 3、其他响应 res.redirect("http://www.baidu.com"); // 重定向 res.download("./package.json"); // 下载响应 res.json(); // 响应JSON res.sendFile(__dirname + "/home.html"); // 响应文件内容});app.listen(9000, () => { console.log("端口监听中...");});
2.6、express中获取请求体的数据
express可以使用body-parser包处理请求体。
安装:npm i body-parser
使用:
// 导入const express = require("express");const bodyParser = require("body-parser");// 创建应用对象const app = express();// 解析JSON格式的请求体的中间件const jsonParser = bodyParser.json();// 解析querystring格式请求体的中间件const urlencodedParser = bodyParser.urlencoded({ extended: false});// 创建路由规则app.get("/login", (req, res) => { // res.send("表单页面"); res.sendFile(__dirname + "/index.html");});app.post("/login", urlencodedParser, (req, res) => { console.log(req.body); res.send("获取用户数据");});app.listen(9000, () => { console.log("端口监听中...");});
3、中间件
3.1、什么是中间件
Middleware本质上是一个回调函数。可以像路由一样访问请求对象和响应对象。
作用:用于封装公共操作,简化代码。
3.2、类型
- 全局中间件
- 路由中间件
3.3、全局中间件
每一个请求到达服务端之后,都会执行全局中间件函数。
// 导入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; // 将信息保存在文件中 access.log fs.appendFileSync(path.resolve(__dirname, "./access.log"), `${url} ${ip}\r\n`); next();}// 使用中间件函数app.use(recordMiddleware);// 创建路由app.get("/home", (req, res) => { res.send("前台首页"); });app.get("/admin", (req, res) => { res.send("后台首页"); });app.all("*", (req, res) => { res.send("404 no found");});app.listen(9000, () => { console.log("端口监听中...");});
3.4、路由中间件
// 导入const express = require("express");// 创建应用对象const app = express();// 创建路由app.get("/home", (req, res) => { res.send("前台首页"); });// 声明中间件let checkCodeMiddlerware = (req, res, next) => { if (req.query.code === "521") { next(); } else { res.send("暗号错误"); }}app.get("/admin", checkCodeMiddlerware, (req, res) => { res.send("后台首页"); });app.get("/setting", checkCodeMiddlerware, (req, res) => { res.send("设置页面"); });app.all("*", (req, res) => { res.send("404 no found");});app.listen(9000, () => { console.log("端口监听中...");});
3.5、静态资源中间件
express内置处理静态资源的中间件。
// 导入const express = require("express");// 创建应用对象const app = express();// 静态资源中间件设置app.use(express.static(__dirname + "/public"));// 创建路由app.get("/home", (req, res) => { res.send("前台首页"); });app.all("*", (req, res) => { res.send("404 no found");});app.listen(9000, () => { console.log("端口监听中...");});
注意事项:
- 1、index.html为文件默认打开的资源。
- 2、如果静态资源与路由规则同时匹配,谁先匹配谁就响应。
- 3、路由响应动态资源,静态资源中间件响应静态资源。
4、防盗链
通过请求头中的referer来判断。
// 导入const express = require("express");const bodyParser = require("body-parser");// 创建应用对象const app = express();// 声明中间件,防盗链app.use((req, res, next) => { // 检测请求头中的referer是否是127.0.0.1 let referer = req.get("referer"); console.log(referer); if (referer) { let url = new URL(referer); let hostname = url.hostname; if (hostname !== "127.0.0.1") { res.status(404).send("not found"); } } next();})app.listen(9000, () => { console.log("端口监听中...");});
5、路由模块化
创建routes文件夹,用来统一存放路由文件。
routes/homeRouter.js
// 导入const express = require("express");// 创建路由对象const router = express.Router();router.get("/home", (req, res) => { res.send("后台首页");});module.exports = router;
6、模板引擎EJS
分离用户界面和业务数据的一种技术。
EJS是一种高效的JS的模板引擎。
安装:npm i ejs --save
6.1、初体验
index.html
Document 我爱你 <%= china %>
<%= weather %>
index.js
const ejs = require("ejs");const fs = require("fs");let china = "中国";let weather = "天气晴";let str = fs.readFileSync("./index.html").toString();let result = ejs.render(str, {china, weather});console.log(result);
6.2、ejs列表渲染
const ejs = require("ejs");const fs = require("fs");let arr = [1,2,3,4,5];let result = ejs.render(` <% arr.forEach(item => { %> - <%= item %>
<% }) %>
`, { arr });console.log(result);
6.3、ejs的条件渲染
const ejs = require("ejs");const fs = require("fs");let isTrue = false;let result = ejs.render(` <% if (isTrue) { %> 主人 <% } else { %> 其他人 <% } %>`, { isTrue });console.log(result);
6.4、express中使用EJS
创建views文件夹,用于存放模板文件,后缀名是ejs。
views/home.ejs:
Document <%= title %>
index.js:
// 导入const express = require("express");const path = require("path");// 创建应用对象const app = express();// 1、设置模板引擎app.set("view engine", "ejs"); // 2、设置模板引擎文件存放位置app.set("views", path.resolve(__dirname, "./views"));// 创建路由app.get("/home", (req, res) => { let title = "你好"; res.render("home", {title});});app.all("*", (req, res) => { res.send("404 not found!
");});app.listen(9000, () => { console.log("端口监听中...");});
7、express-generator工具
通过应用生成工具express-generator可以快速创建一个应用的骨架,相当于脚手架。
可以通过npx(包含在Node.js8.2.0以及更高版本中)命令来运行Express应用程序生成器。
npx express-generator
对于较老版本的node,请通过npm将Express应用程序生成器安装到全局环境中使用:
npm install -g express-generator
express -e <项目名>,创建项目。
npm i 安装项目的依赖。
-h参数可以列出所有可用的命令行参数。
8、文件上传
使用formidable处理文件上传的请求。
npm i formidable
var express = require("express");var router = express.Router();// 导入const path = require("path");const formidable = require("formidable");/* GET home page. */router.get("/", function(req, res, next) { res.render("index", { title: "Express" });});// 显示网页的表单router.get("/portrait", (req, res) => { res.render("portrait");});// 处理文件上传router.post("/portrait", (req, res) => { const form = formidable({ multiples: true, // 设置文件的保存目录 uploadDir: path.resolve(__dirname, "../public/images"), // 保持文件后缀 keepExtensions: true, }); // 解析请求报文 form.parse(req, (err, fields, files) => { if (err) { // next(err); console.log(err); return; } console.log(fields); // text rdion checkbox select console.log(files); // file // 服务器保存该图片的访问URL let url = "/images/" + files.portrait.newFilename; // 将来将此数据保存在数据库中 res.send(url); });});module.exports = router;
-
express框架的基本使用
博客园 2023-05-18
-
焦点热议:风王吸尘器怎么样_风王干湿两用吸尘器
互联网 2023-05-18
-
让股东满意 美菱将启动40周年股东感恩回馈节-当前热议
家电网 2023-05-18
-
联发科与小米联合定义天玑8200-Ultra,这是颗影像特长芯
科技知讯界 2023-05-18
-
今热点:[路演]ST华英:未来公司将对预制菜产品体系进行升级 打造爆款
全景网 2023-05-18
-
2023年5月17日一美金等于多少新元?
腾赚网 2023-05-18
-
注意啦!益阳市今年中小学招生入学政策有调整与优化
湖南日报 2023-05-18
-
送法上门!潞州区助企发展“零距离”
凯迪网 2023-05-18
-
5月18日国内钴市行情汇总 世界热门
生意社 2023-05-18
-
林洋能源:计划2023年内新增投产二期PACK线 届时年产能将达到3GWh
界面新闻 2023-05-18
-
express框架的基本使用
博客园 2023-05-18
-
焦点热议:风王吸尘器怎么样_风王干湿两用吸尘器
互联网 2023-05-18
-
让股东满意 美菱将启动40周年股东感恩回馈节-当前热议
家电网 2023-05-18
-
联发科与小米联合定义天玑8200-Ultra,这是颗影像特长芯
科技知讯界 2023-05-18
-
今热点:[路演]ST华英:未来公司将对预制菜产品体系进行升级 打造爆款
全景网 2023-05-18
-
2023年5月17日一美金等于多少新元?
腾赚网 2023-05-18
-
注意啦!益阳市今年中小学招生入学政策有调整与优化
湖南日报 2023-05-18
-
送法上门!潞州区助企发展“零距离”
凯迪网 2023-05-18
-
5月18日国内钴市行情汇总 世界热门
生意社 2023-05-18
-
林洋能源:计划2023年内新增投产二期PACK线 届时年产能将达到3GWh
界面新闻 2023-05-18
-
全球视讯!王俊凯生日是农历还是阳历_王俊凯生日
互联网 2023-05-18
-
孕妇为什么会吐得厉害_每日快看
南方养生网 2023-05-18
-
H&H国际控股(01112.HK)附属拟获授5亿元为期30个月的贷款融资|全球要闻
智通财经网 2023-05-18
-
纳智捷属于哪个地区的品牌 纳智捷是哪个国家的品牌
元宇宙网 2023-05-18
-
郑州5月20日是周六可以领证吗
本地宝 2023-05-18
-
美“深海博士”在海底小屋住了74天 打破吉尼斯世界纪录-当前报道
中国新闻网 2023-05-18
-
天天微头条丨慧聪集团:北京兆信于北交所上市的建议已获北京兆信股东批准
网经社 2023-05-18
-
类似进击巨人的动漫神作_类似进击的巨人的动漫
互联网 2023-05-18
-
人民网百秒视频带您探馆第七届世界智能大会
杭州网 2023-05-18
-
dnf年套宠物装备_dnf年套
互联网 2023-05-18
-
中国式现代化的长三角实践 产业跨省“联姻” 山城“链”上起舞_快讯
人民网-安徽频道 2023-05-18
-
南方养老目标日期2055五年持有期混合型发起式基金中基金(FOF)开放日常申购及定投业务的公告
易天富 2023-05-18
-
时讯:皇马1-5出局,巴萨聊天群炸锅:全队赞曼城,哈维祝贺瓜帅
手机网易网 2023-05-18
-
洽洽食品(002557):5月17日北向资金减持23.26万股 今日要闻
证券之星 2023-05-18
-
秋水仙素的作用原理是 秋水仙素的作用原理
城市网 2023-05-18
-
饥荒指令代码大全_饥荒指令大全 世界热头条
互联网 2023-05-18
-
前沿资讯!黄雅琼社恐叫停加油声!石宇奇劈叉救球,新加坡骆建贤贡献名场面
排球黄金眼 2023-05-17
-
宁波银行信用卡网上申请可以吗?怎么申请?
金融啦 2023-05-17
-
新疆初级会计成绩可以保留几年|观察
中华网考试 2023-05-17
-
拼多多的拼单全额返是什么意思(拼多多拼单全额返是啥意思)
互联网 2023-05-17