Node.js后端构建指南:MongoDB与Express的集成

安装express

安装 Express 并将其保存到依赖列表中:

$ cnpm install express --save

以上命令会将 Express 框架安装在当前目录的 node_modules 目录中, node_modules 目录下会自动创建 express 目录。以下几个重要的模块是需要与 express 框架一起安装的:

  • body-parser - node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。
  • cookie-parser - 这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。
  • multer - node.js 中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据。

安装完后,我们可以查看下 express 使用的版本号:

$ cnpm list express
/data/www/node
└── express@4.15.2  -> /Users/tianqixin/www/node/node_modules/.4.15.2@express

express项目架构

Express项目的架构可以根据具体需求和规模的不同而有所不同,但通常遵循一些基本的组织原则。以下是一个常见的Express项目架构示例:

  1. 根目录结构
    • app.js  或  server.js :Express应用程序的入口文件,包含应用程序的配置和启动代码。
    • package.json :包含项目的依赖项和脚本配置。
    • node_modules/ :存放项目依赖的Node.js模块。
    • public/ :存放静态文件(如CSS、JavaScript、图片等)。
    • views/ :存放视图模板文件(如EJS、Pug等)。
  1. 路由结构
    • routes/ 目录:存放路由文件,可根据功能或模块划分子路由文件。
    • app.js 中设置路由:在 app.js 中通过 app.useapp.get 等方法将路由文件引入并设置路由路径。
  1. 中间件
    • middlewares/ 目录:存放自定义中间件函数。
    • app.js 中使用中间件:在 app.js 中通过 app.use 方法使用中间件。
  1. 控制器
    • controllers/ 目录:存放路由处理函数,负责处理请求并返回响应。
    • 与路由文件分离:控制器文件应与路由文件分离,遵循单一职责原则。
  1. 模型
    • models/ 目录:存放数据模型定义和数据库操作。
    • 与控制器分离:模型文件应与控制器文件分离,负责数据操作和业务逻辑。
  1. 配置
    • config/ 目录:存放配置文件,如数据库配置、环境变量等。
    • 环境变量:使用 .env 文件存放敏感信息,并通过 dotenv 模块加载。
  1. 错误处理
    • 错误处理中间件:编写统一的错误处理中间件,处理应用程序中发生的错误。
  1. 测试
    • tests/ 目录:存放单元测试和集成测试文件,使用测试框架进行测试。

以上是一个基本的Express项目架构示例,你可以根据具体项目需求和规模进行调整和扩展。

创建一个express示例


var express = require('express');
var app = express();app.get('/', function (req, res) {res.send('Hello World');
})var server = app.listen(8081, function () {var host = server.address().addressvar port = server.address().portconsole.log("应用实例,访问地址为 http://%s:%s", host, port)})

请求和响应

Express 应用使用回调函数的参数: requestresponse 对象来处理请求和响应的数据。

app.get('/', function (req, res) {// --
})
app.post('/',(req,res)=>{})

requestresponse 对象的具体介绍:

Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:

  1. req.app:当callback为外部文件时,用req.app访问express的实例
  2. req.baseUrl:获取路由当前安装的URL路径
  3. req.body / req.cookies:获得「请求主体」/ Cookies
  4. req.fresh / req.stale:判断请求是否还「新鲜」
  5. req.hostname / req.ip:获取主机名和IP地址
  6. req.originalUrl:获取原始请求URL
  7. req.params:获取路由的parameters
  8. req.path:获取请求路径
  9. req.protocol:获取协议类型
  10. req.query:获取URL的查询参数串
  11. req.route:获取当前匹配的路由
  12. req.subdomains:获取子域名
  13. req.accepts():检查可接受的请求的文档类型
  14. req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages:返回指定字符集的第一个可接受字符编码
  15. req.get():获取指定的HTTP请求头
  16. req.is():判断请求头Content-Type的MIME类型

Response 对象 - response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有:

  1. res.app:同req.app一样
  2. res.append():追加指定HTTP头
  3. res.set()在res.append()后将重置之前设置的头
  4. res.cookie(name,value [,option]):设置Cookie
  5. opition: domain / expires / httpOnly / maxAge / path / secure / signed
  6. res.clearCookie():清除Cookie
  7. res.download():传送指定路径的文件
  8. res.get():返回指定的HTTP头
  9. res.json():传送JSON响应
  10. res.jsonp():传送JSONP响应
  11. res.location():只设置响应的Location HTTP头,不设置状态码或者close response
  12. res.redirect():设置响应的Location HTTP头,并且设置状态码302
  13. res.render(view,[locals],callback):渲染一个view,同时向callback传递渲染后的字符串,如果在渲染过程中有错误发生next(err)将会被自动调用。callback将会被传入一个可能发生的错误以及渲染后的页面,这样就不会自动输出了。
  14. res.send():传送HTTP响应
  15. res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type
  16. res.set():设置HTTP头,传入object可以一次设置多个头
  17. res.status():设置HTTP状态码
  18. res.type():设置Content-Type的MIME类型

路由

我们已经了解了 HTTP 请求的基本应用,而路由决定了由谁(指定脚本)去响应客户端请求。

在HTTP请求中,我们可以通过路由提取出请求的URL以及GET/POST参数。

接下来我们扩展 Hello World,添加一些功能来处理更多类型的 HTTP 请求。

创建 express_demo2.js 文件,代码如下所示:

var express = require('express');
var app = express();//  主页输出 "Hello World"
app.get('/', function (req, res) {console.log("主页 GET 请求");res.send('Hello GET');
})//  POST 请求
app.post('/', function (req, res) {console.log("主页 POST 请求");res.send('Hello POST');
})//  /del_user 页面响应
app.get('/del_user', function (req, res) {console.log("/del_user 响应 DELETE 请求");res.send('删除页面');
})//  /list_user 页面 GET 请求
app.get('/list_user', function (req, res) {console.log("/list_user GET 请求");res.send('用户列表页面');
})// 对页面 abcd, abxcd, ab123cd, 等响应 GET 请求
app.get('/ab*cd', function(req, res) {   console.log("/ab*cd GET 请求");res.send('正则匹配');
})var server = app.listen(8081, function () {var host = server.address().addressvar port = server.address().portconsole.log("应用实例,访问地址为 http://%s:%s", host, port)})

app.use

在Express中, `app.use` 函数用于将中间件函数绑定到应用程序的特定路径。中间件函数可以访问请求对象(req)、响应对象(res)和应用程序中的下一个中间件函数(next)。通过使用 `app.use` ,可以在请求到达特定路径之前或之后执行一些操作,例如记录日志、验证用户身份、处理请求等。

const express = require('express');
const app = express();// 自定义的日志记录中间件函数
const logMiddleware = (req, res, next) => {console.log(`[${new Date().toLocaleString()}] - ${req.method} ${req.url}`);next();
};// 将日志记录中间件绑定到应用程序的根路径
app.use(logMiddleware);// 路由处理程序
app.get('/', (req, res) => {res.send('Hello World!');
});// 启动服务器
app.listen(3000, () => {console.log('Server is running on port 3000');
});

托管静态资源

app.use(express.static('./public'));

url里面不需要带有public

http://localhost:8081/public.jpg

有两个资源,按照引入顺序

app.use('/public',express.static('./public'));

中间件

全局生效中间件

var express = require('express');
var app = express();
const ww=function(req,res,next){console.log(18948);next()
}
app.use(ww)
app.get('/',(req,res)=>{console.log('over');
})
var server = app.listen(8081, function () {var host = server.address().addressvar port = server.address().portconsole.log("应用实例,访问地址为 http://%s:%s", host, port)})

局部生效中间件

var express = require('express');
var app = express();
const ww=function(req,res,next){req.a=1598next()
}
app.get('/',ww,(req,res)=>{res.send('over',req.a);
})
app.get('/55',(req,res)=>{res.send('over1',req.a);
})
var server = app.listen(8081, function () {var host = server.address().addressvar port = server.address().portconsole.log("应用实例,访问地址为 http://%s:%s", host, port)})

错误全局中间件

var express = require('express');
var app = express();
app.get('/',(req,res)=>{throw new Error('服务器错误')res.send('home')
})
app.use(function(err,req,res,next) {res.send('Error'+err.message)
})
var server = app.listen(8081, function () {var host = server.address().addressvar port = server.address().portconsole.log("应用实例,访问地址为 http://%s:%s", host, port)})

目的

防止整个项目崩溃

位置

必须放在所以的路由之后

内置中间件

注意事项

解析表单

html:

<html>
<body>
<form action="http://127.0.0.1:8081/process_post" method="POST">
First Name: <input type="text" name="first_name">  <br>Last Name: <input type="text" name="last_name">
<input type="submit" value="Submit">
</form>
</body>
</html>

node:

var express = require('express');
var app = express();
var bodyParser = require('body-parser');app.use(express.json())app.get('/index.html', function (req, res) {res.send(req.body)
})var server = app.listen(8081, function () {var host = server.address().addressvar port = server.address().portconsole.log("应用实例,访问地址为 http://%s:%s", host, port)})

文件上传

以下我们创建一个用于上传文件的表单,使用 POST 方法,表单 enctype 属性设置为 multipart/form-data。

html:

<html>
<head>
<title>文件上传表单</title>
</head>
<body>
<h3>文件上传:</h3>
选择一个文件上传: <br />
<form action="/file_upload" method="post" enctype="multipart/form-data">
<input type="file" name="image" size="50" />
<br />
<input type="submit" value="上传文件" />
</form>
</body>
</html>

node:

var express = require('express');
var app = express();
var fs = require("fs");var bodyParser = require('body-parser');
var multer  = require('multer');app.use('/public', express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(multer({ dest: '/tmp/'}).array('image'));app.get('/index.html', function (req, res) {res.sendFile( __dirname + "/" + "index.html" );
})app.post('/file_upload', function (req, res) {console.log(req.files[0]);  // 上传的文件信息var des_file = __dirname + "/" + req.files[0].originalname;fs.readFile( req.files[0].path, function (err, data) {fs.writeFile(des_file, data, function (err) {if( err ){console.log( err );}else{response = {message:'File uploaded successfully', filename:req.files[0].originalname};}console.log( response );res.end( JSON.stringify( response ) );});});
})var server = app.listen(8081, function () {var host = server.address().addressvar port = server.address().portconsole.log("应用实例,访问地址为 http://%s:%s", host, port)})

项目

路由模块化

router.js

const express=require('express');
// 创建路由对象
const router =express.Router()router.get('/',(req,res)=>{res.send('hello world')
})
module.exports=router;

server.js

var express = require('express');
const router = require('./router.js');
var app = express();app.use('/public',express.static('public'));
app.use(router)
var server = app.listen(8081, function () {var host = server.address().addressvar port = server.address().portconsole.log("应用实例,访问地址为 http://%s:%s", host, port)})

url添加统一地址

app.use('/user',router)

连接MongoDB

要使用MongoDB,您需要安装MongoDB数据库,并且可以使用MongoDB的官方驱动程序或者第三方库(如Mongoose)来与数据库进行交互。以下是使用MongoDB的基本步骤:

  1. 安装MongoDB数据库:您可以从MongoDB的官方网站(https://www.mongodb.com/)下载适合您操作系统的安装程序,并按照安装指南进行安装。
  2. 启动MongoDB服务:安装完成后,启动MongoDB服务。在命令行中输入  mongod (或  sudo mongod )来启动MongoDB服务。
  3. 连接到MongoDB数据库:在另一个命令行窗口中输入  mongo  命令来连接到MongoDB数据库。

修改这3个能够远程访问

检验:ip:27017

  1. 使用MongoDB Shell:通过MongoDB Shell,您可以执行各种数据库操作,如创建数据库、创建集合、插入文档、查询文档等。以下是一些常用的MongoDB Shell命令:
    • 创建数据库: use database_name
    • 创建集合: db.createCollection('collection_name')
    • 插入文档: db.collection_name.insertOne({ key: value })
    • 查询文档: db.collection_name.find()
  1. 使用Node.js与MongoDB交互:如果您想在Node.js应用程序中使用MongoDB,可以使用MongoDB的官方Node.js驱动程序或者像Mongoose这样的库。以下是使用Mongoose库的简单示例:
const mongoose = require('mongoose');mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {console.log("Connected to MongoDB");
});// 定义模式和模型
const Schema = mongoose.Schema;
const userSchema = new Schema({name: String,age: Number
});
const User = mongoose.model('User', userSchema);// 创建文档
const newUser = new User({ name: 'Alice', age: 30 });
newUser.save(function (err) {if (err) return console.error(err);console.log("User saved successfully!");
});

定义模式和模型(类似于ts的interface定义)

在使用Mongoose这样的库时,定义模式和模型是非常重要的步骤,用于帮助您在Node.js应用程序中与MongoDB数据库进行交互。让我来解释一下这两个概念的含义:

  1. 定义模式(Schema):模式是用来定义MongoDB文档结构的一种方式,类似于表结构的定义。在Mongoose中,您可以通过定义模式来规定文档中包含的字段、字段类型、默认值等信息。模式定义了文档的结构,类似于一个数据模板,确保文档符合特定的结构和规范。
    例如,您可以定义一个用户模式(User Schema),包含姓名(name)和年龄(age)两个字段:
const userSchema = new Schema({
name: String,
age: Number
}); 
  1. 定义模型(Model):模型是基于模式创建的构造函数,用于对数据库进行操作。在Mongoose中,您可以通过定义模型来创建具体的文档实例,以便对数据库进行增删改查操作。模型是模式的实例化,它允许您在应用程序中使用模式定义的字段和规范。
    通过使用上面定义的用户模式,您可以创建一个用户模型(User Model):
const User = mongoose.model('User', userSchema);

现在,您可以使用User模型来创建新的用户文档、查询用户数据、更新用户信息等操作。

通过定义模式和模型,您可以规范化数据结构、提供数据验证、简化数据库操作等。这些概念帮助您在Node.js应用程序中更好地与MongoDB数据库进行交互,并更有效地管理数据。

在路由中使用

要在Express应用程序的路由中使用Mongoose模型(即在路由处理程序中与MongoDB数据库进行交互),可以按照以下步骤进行操作:

  1. 引入Mongoose模型:首先,在您的Express应用程序中,确保已经引入了Mongoose模型。通常,您会在单独的文件中定义模型,并在需要的地方引入该模型。
const User = require('./models/user'); // 假设User模型定义在models/user.js文件中
  1. 在路由处理程序中使用Mongoose模型:在您的路由处理程序中,您可以通过Mongoose模型执行数据库操作,如查询、插入、更新、删除等操作。以下是一个简单的示例
const express = require('express');
const router = express.Router();
const User = require('../models/user');// GET请求,获取所有用户
router.get('/users', async (req, res) => {try {const users = await User.find();res.json(users);} catch (err) {res.status(500).json({ message: err.message });}
});// POST请求,创建新用户
router.post('/users', async (req, res) => {const user = new User({name: req.body.name,age: req.body.age});try {// 尝试保存新用户到数据库const newUser = await user.save();// 如果保存成功,返回状态码201和新用户信息res.status(201).json(newUser);} catch (err) {// 如果保存失败,返回状态码400和错误信息res.status(400).json({ message: err.message });}
});module.exports = router;

在上面的示例中,我们定义了两个路由处理程序,一个用于获取所有用户,另一个用于创建新用户。在处理程序中,我们通过引入的User模型来执行数据库操作,如查询所有用户(User.find())和创建新用户(user.save())。

在Mongoose中,模型(Model)对象(如 User )可以调用一些内置的方法来执行数据库操作。以下是一些常用的Mongoose模型方法:

  1. save():将文档保存到数据库中。
  2. find():查找匹配条件的文档。
  3. findOne():查找匹配条件的第一个文档。
  4. findById():根据文档ID查找文档。
  5. findOneAndUpdate():查找并更新匹配条件的第一个文档。
  6. updateOne():更新匹配条件的第一个文档。
  7. updateMany():更新匹配条件的所有文档。
  8. deleteOne():删除匹配条件的第一个文档。
  9. deleteMany():删除匹配条件的所有文档。
  10. countDocuments():统计匹配条件的文档数量。
  11. aggregate():执行聚合操作,如分组、筛选等。
  12. distinct():查找匹配条件的文档并返回指定字段的唯一值。

除了上述方法外,您还可以根据具体需求使用Mongoose提供的其他方法来执行更复杂的数据库操作。这些方法使得在Node.js应用程序中与MongoDB数据库交互变得更加方便和灵活。希望这些信息对您有帮助。如果您有任何进一步的问题,请随时告诉我。

通过这种方式,在Express应用程序的路由中使用Mongoose模型,您可以方便地与MongoDB数据库进行交互,执行各种数据库操作。

https配置

var express = require('express');
var path = require('path');
var http = require('http');
var https = require('https');
var fs = require('fs');var app = express();app.get('/', function(req, res, next) {res.send('hello world');
});var httpServer = http.createServer(app);
httpServer.listen(9080);const options = {key: fs.readFileSync('./server.key'),cert: fs.readFileSync('./server.crt')
};
var httpsServer = https.createServer(options, app);
httpsServer.listen(9443);

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

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

相关文章

nss刷题(4)

1、[SWPUCTF 2021 新生赛]easyrce <?php error_reporting(0); highlight_file(__FILE__); if(isset($_GET[url])) { eval($_GET[url]); } ?> if(isset($_GET[url])) isset函数用来检测url变量是否存在&#xff1b;$_GET函数获取变量数据 eval($_GET[url]); eval函数用…

【GIS矢量切片】tippecanoe在Windows和CentOS中的安装

组件安装记录 背景介绍Windows下安装1、下载工具2、存放安装包3、进入DOS终端4、在终端执行命令5、下载程序6、放置源码7、修改配置信息8、编译9、测试10、参数说明瓦片输出瓦片描述和权属信息输入文件和图层名输入文件的并行处理输入文件的投影缩放级别瓦片分辨率CentOS 7安装…

第三篇——大数据思维的科学基础

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 大数据时代&#xff0c;大数据思维的重要性不言而喻&#xff1b;而信息在…

6月26~28日,2024北京国际消防展即将开幕!

随着社会的快速发展&#xff0c;消防安全日益受到广大民众的高度关注。为了进一步推动消防科技的创新与发展&#xff0c;提升全民消防安全意识&#xff0c;2024年北京消防展将于6月26日在北京国家会议中心盛大开展。目前:观众预登记已全面启动&#xff0c;广大市民和业界人士可…

SQLite3(1):介绍安装与测试

目录 1、SQLite3介绍 2、SQLite3的优势和特性 3、SQLite3安装与测试 3.1 SQLite3安装 3.2 SQLite3测试 4、SQLite3简单使用 4.1 连接数据库文件 4.2 创建信息表 4.3 插入三个学生信息 4.4 确认信息 5、总结 1、SQLite3介绍 SQLite3是一种轻量级的关系型数据库管理系…

论文阅读 A Distributional Framework for Data Valuation

本论文解决的问题 量化数据价值&#xff08;机器学习模型训练中各个数据点的贡献&#xff09; 避免数据价值受到其所处数据集的影响&#xff0c;使数据点的估值更加稳定、一致 变量假设 假设 D 表示一个在全集 Z 上的数据分布。对于监督学习问题&#xff0c;我们通常认为 Z…

jvm学习笔记(一) ----- JAVA 内存

JAVA 内存 一、程序计数器二、虚拟机栈三、本地方法栈四、堆五、非JAVA内存(堆外内存)1.元空间(Metaspace)2.直接内存 链接: jvm学习笔记(二) ----- 垃圾回收 链接: jvm学习笔记(三) ----- 垃圾回收器 一、程序计数器 虚拟机需要通过『程序计数器』记录指令执行到哪了。线程要…

代码随想录算法训练营day43

题目&#xff1a;1049. 最后一块石头的重量 II 、494. 目标和、474.一和零 参考链接&#xff1a;代码随想录 1049. 最后一块石头的重量 II 思路&#xff1a;本题石头是相互粉碎&#xff0c;粉碎后剩下的重量就是两块石头之差&#xff0c;我们可以想到&#xff0c;把石头分成…

使用智谱 GLM-4-9B 和 SiliconCloud 云服务快速构建一个编码类智能体应用

本篇文章我将介绍使用智谱 AI 最新开源的 GLM-4-9B 模型和 GenAI 云服务 SiliconCloud 快速构建一个 RAG 应用&#xff0c;首先我会详细介绍下 GLM-4-9B 模型的能力情况和开源限制&#xff0c;以及 SiliconCloud 的使用介绍&#xff0c;最后构建一个编码类智能体应用作为测试。…

数据结构和算法之数组和链表

一、数组 数组是一种线性数据结构&#xff0c;它是由一组连续的内存单元组成的&#xff0c;用于存储相同类型的数据。在JavaScript中&#xff0c;数组可以包含任意类型的数据&#xff0c;不只限于基本数据类型。 1.存储方式 在内存中&#xff0c;数组的元素是连续存储的&…

【Vue】组件的存放目录问题

注意&#xff1a; .vue文件 本质无区别 组件分类 .vue文件分为2类&#xff0c;都是 .vue文件&#xff08;本质无区别&#xff09; 页面组件 &#xff08;配置路由规则时使用的组件&#xff09;复用组件&#xff08;多个组件中都使用到的组件&#xff09; 存放目录 分类开来的…

Llama模型家族之拒绝抽样(Rejection Sampling)(二)均匀分布简介

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

ssti模板注入

一、Flask应用 1、介绍 定义 Flask&#xff1a;是一个使用Python编写的轻量级web应用框架。Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。 特点 良好的文档、丰富的插件、包含开发服务器和调试器、集成支持单元测试、RESTful请求调度、支持安全cookies、基于Unicode。 …

手机短信删除怎么恢复?快速找回的3个秘密武器

手机&#xff0c;这个我们每天离不开的小玩意儿&#xff0c;有时候也会让我们头疼不已。比如&#xff0c;你一不小心&#xff0c;或者为了清理点空间&#xff0c;就把那些重要的短信给删了。这些短信可能是你和好友的深夜聊天&#xff0c;或者是重要的工作信息。一旦删除&#…

哪款开放式耳机佩戴最舒服?2024五款备受推崇产品分享!

​在现今耳机市场&#xff0c;开放式耳机凭借其舒适的佩戴体验和独特的不入耳设计&#xff0c;备受消费者追捧。它们不仅让你在享受音乐时&#xff0c;仍能察觉周围的声音&#xff0c;确保与人交流无障碍&#xff0c;而且有利于耳朵的卫生与健康。对于运动爱好者和耳机发烧友而…

GIGE 协议摘录 —— 引导寄存器(四)

系列文章目录 GIGE 学习笔记 GIGE 协议摘录 —— 设备发现&#xff08;一&#xff09; GIGE 协议摘录 —— GVCP 协议&#xff08;二&#xff09; GIGE 协议摘录 —— GVSP 协议&#xff08;三&#xff09; GIGE 协议摘录 —— 引导寄存器&#xff08;四&#xff09; GIGE 协议…

前后端实现文件上传进度条-实时进度

后端接口代码&#xff1a; PostMapping("/upload")public ResponseEntity<String> handleFileUpload(RequestParam("file") MultipartFile file) {try {// 获取文件名String fileName file.getOriginalFilename();// 创建上传目标路径Path targetPa…

基于简单Agent对医疗数据进行分析

数据表 供应商资格审核规定.pdf 医生名录.xlsx 历史就诊记录.xlsx 患者信息名录.xlsx 药品.xlsx 药品库存管理.xlsx 采购单位基本信息.xlsx Agent测试 模型基于ChatGPT-3.5 问题&#xff1a;帮我找出不达标的供应商 Agent分析过程 [Thought: 0] Key Concepts: - 不达标的供…

嵌入式Linux系统中RTC应用的操作详解

第一:RTC的作用以及时间简介 “RTC”的英文全称是Reul-Time Clock,翻译过来是实时时钟芯片.实时时钟芯片是日常生活中应用最为广泛的电子器件之一,它为人们或者电子系统提供精确的实时时间,实时时钟芯片通过引脚对外提供时间读写接口,通常内部带有电池,保证在外部系统关…

【Android】使用EventBus进行线程间通讯

EventBus 简介 EventBus&#xff1a;github EventBus是Android和Java的发布/订阅事件总线。 简化组件之间的通信 解耦事件发送者和接收者 在 Activities, Fragments, background threads中表现良好 避免复杂且容易出错的依赖关系和生命周期问题 Publisher使用post发出…