【学习笔记】后端(Ⅰ)—— NodeJS(Ⅱ)

NodeJS

  • 3、进阶篇 —— Express框架
    •       3.1、Express 框架介绍
    •       3.2、Express 框架初体验
    •       3.3、使用
    •       3.4、中间件
    •       3.5、托管静态文件
    •       3.6、获取表单数据
    •       3.7、防盗链
    •       3.8、路由模式化
    •       3.8、EJS 模板引擎
    •       3.9、express-generator
    •       3.10、文件上传
    •       3.11、cookie
    •       3.12、session
    •       3.13、token
  • 4、进阶篇 —— Mongodb
    •       4.1、MongoDB 介绍
    •       4.2、MongoDB 概念
    •       4.3、MongoDB 下载与启动
    •       4.4、MongoDB 命令
    •       4.5、Mongoose
      •             4.5.1 连接数据库
      •             4.5.2 插入文档
      •             4.5.3 字段类型和字段验证
      •             4.5.4 读取文档
      •             4.5.5 更新文档
      •             4.5.6 删除文档
      •             4.5.7 条件控制
      •             4.5.8 查询方法
      •             4.5.9 代码模块化

3、进阶篇 —— Express框架

      3.1、Express 框架介绍

安装:npm i express

        Express是一个流行的Node.js Web应用程序框架,它提供了一组强大的特性,可以帮助你快速搭建和扩展Web应用程序。以下是Express框架的一些主要特点和概念
        ① 简洁而灵活的路由系统:Express提供了简洁而灵活的路由定义方式,可以根据HTTP请求的不同方法(GET、POST等)和URL路径(路由)来执行相应的处理逻辑
        ② 中间件(Middleware):中间件是Express的核心概念之一。它是一个函数,可以访问请求对象(req)、响应对象(res)和应用程序中的下一个中间件函数(next)。中间件函数可以用于执行各种任务,如日志记录、身份验证、请求处理等
        ③ 模板引擎支持:Express允许你使用各种模板引擎来生成动态HTML页面,如Pug(以前称为Jade)、EJS等
        ④ 静态文件服务:Express可以轻松地托管静态文件,如HTML、CSS、JavaScript、图像等。这对于构建单页应用程序(SPA)或简单的网站非常有用
        ⑤ 错误处理:Express提供了一种简单但灵活的错误处理机制,可以捕获和处理应用程序中的错误
        ⑥ 会话管理:虽然Express本身不提供会话管理功能,但可以轻松集成第三方中间件来实现会话管理,如express-session
        ⑦ 可扩展性:Express是一个非常灵活的框架,你可以使用第三方中间件和插件来扩展其功能,满足特定需求
        ⑧ RESTful API支持:由于Express的路由系统非常灵活,因此它非常适合构建RESTful API
        总的来说,Express是一个轻量级、快速和灵活的Web应用程序框架,非常适合构建各种类型的Web应用程序,从简单的静态网站到复杂的API服务

      3.2、Express 框架初体验

<!-- 前端代码 -->
<!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><a href="http://localhost:3000/"><button>点我一下</button></a>
</body>
</html>
// 服务器代码//引入
const express = require("express");
//创建应用对象
const app = express();
//创建路由
app.get("/", (req, res) => {res.end("Hello World!");
});
//监听端口启动服务
app.listen(3000, () => {console.log("服务器已启动,端口3000监听中...");
});

      3.3、使用

express实例(app)常用api描述
app.get(path, callback)用于处理HTTP GET请求,并且当请求的路径匹配指定的路径时执行回调函数
app.post(path, callback)用于处理HTTP POST请求
app.put(path, callback)用于处理HTTP PUT请求
app.delete(path, callback)用于处理HTTP DELETE请求
app.all(path, callback)用于处理所有HTTP方法的请求,不论是GET、POST、PUT还是DELETE
app.use(middleware)用于将中间件函数添加到应用程序的请求处理链中。这个中间件函数可以是自定义的,也可以是Express内置的中间件函数
app.param(name, callback)用于定义路由参数的中间件函数。当某个路由中包含定义的参数时,这个中间件函数将被调用
app.get(setting)用于获取应用程序的配置参数
app.set(setting, value)用于设置应用程序的配置参数,如视图引擎、端口号等
app.locals一个对象,用于存储应用程序的本地变量。这些变量在整个应用程序中都可以访问
app.listen(port, [callback])用于启动Express应用程序并监听指定的端口。当应用程序启动时,可选的回调函数将被调用
app.route(path)用于创建一个新的路由对象,该对象允许在同一路径上定义多个路由处理器
app.use(express.static(directory))用于托管静态文件,将指定目录下的文件提供给客户端访问
app.engine(ext, callback)用于注册模板引擎
获取请求报文参数描述
req.params路由中的命名参数,如果有的话
req.query路由中的查询字符串参数
req.body请求体中的数据(通常用于POST请求)
req.headers请求头
req.cookies请求中的cookie
req.path请求的路径
req.hostname请求的主机名
req.ip客户端的IP地址
req.protocol请求的协议(http或https)
req.method请求的HTTP方法(GET、POST等)
req.url请求的完整URL路径
req.route当前匹配的路由的信息
req.xhr一个布尔值,指示请求是否是由Ajax发起的
req.get(headerName)获取特定请求头的值
req.httpVersion获取http协议的版本号
响应设置描述
兼容 http 模块的的部分
res.statusCode=xxx设置状态码
res.statusMessage=‘xxx’设置状态信息
res.setHeader(‘xxx’,‘yyy’)设置响应头
res.write(‘xxx’)设置响应体
res.end(‘xxx’)设置响应体且结束响应
express自己的响应方法支持链式调用
res.status(xxx)设置状态码
res.set(‘xxx’,‘yyy’)设置响应头
res.send(‘xxx’)设置响应体
其他响应
res.redirect(‘xxx’)重定向
res.download(‘xxx’)下载响应
res.json({…})响应json
res.sendFile(‘xxx’)响应文件内容

      3.4、中间件

        中间件(Middleware)是Express框架中的一个核心概念,它是一个函数,可以访问请求对象(req)、响应对象(res)和应用程序中的下一个中间件函数(next)。中间件函数可以执行各种任务,如处理请求数据、添加响应数据、记录日志、进行身份验证等,其作用最主要是封装公共操作,简化代码

中间件的主要特性描述
处理请求和响应对象中间件可以对请求和响应进行修改和处理。它们可以读取请求中的数据(如参数、查询字符串、主体内容等),并可以向响应对象中添加数据(如响应头、响应主体等)
结束请求-响应循环中间件可以通过发送响应结束请求-响应循环。例如,可以使用res.send()、res.json()等方法发送响应并结束请求处理
调用下一个中间件中间件可以调用下一个中间件函数,以便将控制权交给下一个中间件。通常使用next()函数来实现。如果中间件不调用next(),则请求将不会继续传递给下一个中间件或路由处理器
实现链式处理多个中间件可以串联在一起,以链式方式处理请求。每个中间件都可以对请求进行处理或修改,然后将其传递给下一个中间件
常见的中间件类型描述
应用级中间件绑定到应用实例app,处理应用程序级别的逻辑
路由级中间件绑定到特定路由,可以处理特定路由的逻辑
错误处理中间件专门用于处理错误的中间件。错误处理中间件有四个参数:err, req, res, next
内置中间件Express提供的一些内置中间件,如express.static用于托管静态文件,express.json和express.urlencoded用于解析请求体
第三方中间件可以使用第三方库提供的中间件,如body-parser、cookie-parser、morgan等
// 应用级中间件
app.use((req, res, next) => {console.log('Request URL:', req.originalUrl);next();
});// 路由级中间件
app.get('/user/:id', (req, res, next) => {console.log('Request Type:', req.method);next();
});// 错误处理中间件
app.use((err, req, res, next) => {console.error(err.stack);res.status(500).send('Something broke!');
});// 内置中间件
app.use(express.static('public'));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));// 第三方中间件
const bodyParser = require('body-parser');
app.use(bodyParser.json());

      3.5、托管静态文件

        express.static是Express框架中用于托管静态文件的中间件。静态文件包括HTML文件、CSS文件、JavaScript文件、图像等。使用express.static中间件,可以让这些文件直接通过URL路径进行访问,而无需编写特定的路由处理器

路由描述
/匹配静态资源目录下的index.html和路径为 / 的路由
/xxx匹配静态资源目录下的xxx文件和路径为xxx的路由

        响应的结果是谁先匹配(写在前面)谁就响应,例如下面的代码,托管静态资源的中间件写在路径为 / 的路由之前,因此当我们访问 / 的时候会优先匹配静态资源目录下的index.html

const express = require("express");
const path = require("path");
const app = express();// 指定静态文件目录
app.use(express.static(path.join(__dirname, "public")));app.get("/", (req, res) => {res.send("Hello World!");
});// 启动服务器
app.listen(3000, () => {console.log("Server is running on port 3000");
});
<!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><a href="http://localhost:3000/info.html"><button>点我一下</button></a>
</body>
</html>
<!-- public/info.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>
</head>
<body><h1>abc</h1>
</body>
</html>

      3.6、获取表单数据

        body-parser是一个Node.js中间件,用于解析请求体的内容,并使其可用于Express框架的路由处理器中。在处理HTTP POST请求或PUT请求时,客户端通常会发送数据作为请求体,这些数据可能是JSON、URL编码的参数或者是文本数据。body-parser中间件帮助Express应用程序解析这些请求体,使得在路由处理器中可以方便地访问这些数据

<!-- 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>
</head>
<body><form action="/login" method="post">username:<input type="text" name="username"><br>password:<input type="text" 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/13667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UNI-APP设置屏幕保持常亮-不熄灭屏幕

前言 最近在实际开发过程中&#xff0c;我们会发现在自己使用的app当中会根据系统无操作熄灭屏幕对于一下需要长时间保持屏幕的业务就很不友好&#xff0c;uni-app也是提供了相应方法加上代码之后-注意app端没报错-不生效就是权限问题-需要设置相对应权限-打自定义包 代码实现…

【BSP开发经验】用户态栈回溯技术

前言 在内核中有一个非常好用的函数dump_stack, 该函数在我们调试内核的过程中可以打印出函数调用关系&#xff0c;该函数可以帮助我们进行内核调试&#xff0c;以及让我们了解内核的调用关系。同时当内核发生崩溃的时候就会自己将自己的调用栈输出到串口。 栈回溯非常有利于我…

溪谷联运SDK功能全面解析

近期&#xff0c;备受用户关注的手游联运10.0.0版本上线了&#xff0c;不少用户也选择了版本更新&#xff0c;其中也再次迎来了SDK的更新。溪谷软件和大家一起盘点一下溪谷SDK的功能都有哪些吧。 一、溪谷SDK具有完整的运营功能和高度扩展性 1.登录&#xff1a;登录是SDK最基础…

物体检测算法-R-CNN,SSD,YOLO

物体检测算法-R-CNN&#xff0c;SSD&#xff0c;YOLO 1 R-CNN2 SSD3 Yolo总结 1 R-CNN R-CNN&#xff08;Region-based Convolutional Neural Network&#xff09;是一种基于区域的卷积神经网络&#xff0c;是第一个成功将深度学习应用到目标检测上的算法。它主要由三个步骤组…

LeetCode 131题详解:高效分割回文串的递归与动态规划方法

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

currentTarget指向监听者Target:指向触发者

在JavaScript的事件处理中&#xff0c;currentTarget 和 target 是两个重要的属性&#xff0c;它们常常用于区分事件处理函数当前绑定的元素和实际触发事件的元素。这两个属性的意义可以用下面的方式解释&#xff1a; currentTarget 指向监听者&#xff1a;这意味着currentTa…

Spring: OncePerRequestFilter

文章目录 一、介绍二、使用 一、介绍 OncePerRequestFilter是Spring Boot中的一个过滤器抽象类&#xff0c;它在Spring Security中也得到了广泛的应用。这个过滤器抽象类的主要目的是确保在每次外部请求时只执行一次过滤操作&#xff0c;对于服务器内部之间的forward等请求&am…

关于如何创建一个可配置的 SpringBoot Web 项目的全局异常处理

前情概要 这个问题其实困扰了我一周时间&#xff0c;一周都在 Google 上旅游&#xff0c;我要如何动态的设置 RestControllerAdvice 里面的 basePackages 以及 baseClasses 的值呢&#xff1f;经过一周的时间寻求无果之后打算决定放弃的我终于找到了一些关键的线索。 当然在此…

Python中的json.dump与json.dumps对比

Python中的json.dump与json.dumps对比 json.dumps()json.dump() json.dumps() dumps 是 “dump string” 的缩写。它将Python对象转换&#xff08;序列化&#xff09;为JSON格式的字符串。数据被转换为一个字符串&#xff0c;并且这个字符串可以直接被写入文件、发送到网络&am…

为什么我用save保存更新,数据库不更新,反而新增一条

今天发现一个奇怪的问题&#xff1a; 为什么我用save保存更新的数据后&#xff0c;数据库不更新&#xff0c;但是增加了一条空数据&#xff0c;我的前台也把数据用json传上去了&#xff0c;也成功了&#xff0c;但是数据库没有更新相应行的数据&#xff0c;而是新增了一条数据&…

SpringBoot前置知识02-spring注解发展史

springboot前置知识01-spring注解发展史 spring1.x spring配置只能通过xml配置文件的方式注入bean,需要根据业务分配配置文件&#xff0c;通过import标签关联。 spring1.2版本出现Transactional注解 <?xml version"1.0" encoding"UTF-8"?> <be…

实现顺序表各种基本运算的算法

实验一&#xff1a;实现顺序表各种基本运算的算法 一、实验目的与要求 目的: 领会顺序表存储结构和掌握顺序表中各种基本运算算法设计。 内容: 编写一个程序sqlist.cpp,实现顺序表的各种基本运算和整体建表算法(假设顺序表的元素类型ElemType为char),并在此基础上设计一个…

计组期末必考大题

一.寻址方式详解 1.直接寻址 指令地址码直接给到操作数所在的存储单元地址 2.间接寻址 A为操作数EA的地址 3.寄存寻址 4.寄存器间接寻址 5.变址寻址 6.基地址寻址 7.小结 二、指令周期详解 一、基本概念 指令周期:去除指令并执行指令所需要的时间指令周期:由若干个CPU周…

如何实现响应式设计

响应式设计&#xff08;Responsive Web Design, RWD&#xff09;是一种设计思路和技术实现方法&#xff0c;它使网站或应用程序能够适配不同大小屏幕和设备。以下是实现响应式设计的详细步骤&#xff1a; 确定设计目标&#xff1a; 首先&#xff0c;你需要明确你的设计目标&am…

C++/ cuda kernel中的模版元编程识别 kernel 模版的数据类型

1&#xff0c;模版元编程 模板元编程是一种利用 C 模板系统在编译时进行计算和生成代码的技术。其原理基于模板特化、递归、模板参数推导等特性&#xff0c;通过模板实例化和展开&#xff0c;在编译时生成代码&#xff0c;以实现在编译期间进行复杂计算和代码生成的目的。 2&am…

开发人员容易被骗的原因有很多,涉及技术、安全意识、社会工程学以及工作环境等方面。以下是一些常见原因:

技术方面&#xff1a; 漏洞和补丁管理不当&#xff1a;未及时更新软件和依赖库可能存在已知漏洞&#xff0c;容易被攻击者利用。缺乏安全编码实践&#xff1a;没有遵循安全编码规范&#xff0c;容易引入SQL注入、跨站脚本&#xff08;XSS&#xff09;等安全漏洞。错误配置&…

None和doctoring的秘密

None和doctoring的秘密 用None和docstring来描述默认值会变的参数 有时&#xff0c;我们想把那种不能够提前固定的值&#xff0c;当作关键字参数的默认值。例如&#xff0c;记录日志消息时&#xff0c;默认的时间应该是出发事件的那一刻。所以&#xff0c;如果调用者没有明确…

前端笔记-day07

学成在线网站 文章目录 效果图代码展示index.htmlindex.cssbase.css 效果图 代码展示 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-w…

vue-router 完整的导航流程解析

1、导航被触发 2、在失活的组件里调用 beforeRouteLeave 守卫 组件内守卫beforeRouteLeave&#xff1a;在离开该组件之前&#xff0c;会先调用它&#xff08;用于在离开组件前保存或清理一些状态&#xff09; import { onBeforeRouteLeave } from vue-routeronBeforeRouteLea…

键盘盲打是练出来的

键盘盲打是练出来的&#xff0c;那该如何练习呢&#xff1f;很简单&#xff0c;看着屏幕提示跟着练。屏幕上哪里有提示呢&#xff1f;请看我的截屏&#xff1a; 截屏下方有8个带字母的方块按钮&#xff0c;这个就是提示&#xff0c;也就是我们常说的8个基准键位&#xff0c;我…