利用node连接mongodb实现一个小型后端服务系统demo
http 请求
- 实现get请求数据库数据;
- 实现添加数据
- 实现编辑数据
- 实现删除数据
- 实现导出txt文件、Excel文件
- 实现查询数据库数据并利用导出为excel文件
node 版本 16.16.0
node 版本 18.16.0 会连接 MongoDB 数据库错误。
Connected to MongoDB failed MongoServerSelectionError: connect ECONNREFUSED ::1:27017
{"name": "http-node-demo","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1","start": "node index.js"},"author": "","license": "ISC","type": "module","dependencies": {"body-parser": "^1.20.2","mongodb": "^6.8.0","querystring": "^0.2.1"}
}
项目安装 MongoDB 的 node 版本要跟启动时的 node 版本一致,否则会报错
const timeoutError = new error_1.MongoServerSelectionError(`Server selection timed out after ${options.serverSelectionTimeoutMS} ms`,this.description
);
node 链接 MongoDB
// MongoDB连接配置
const mongoConfig = {url: "mongodb://localhost:27017",dbName: "note", //数据库名称
};
import { MongoClient } from "mongodb";
import { mongoConfig } from "./default.js";
const mongoDB = new MongoClient(mongoConfig.url);let db;async function mainFun() {// 创建MongoDB连接try {await mongoDB.connect();console.log("Connected to MongoDB successfully");db = mongoDB.db(mongoConfig.dbName);} catch (err) {console.log("Connected to MongoDB failed", err);}
}export { mainFun, db };
接口返回的形势
- 返回 404
// 解析url
const urlObj = new URL(req.url, `http://${req.headers.host}`);const params = {};
const apiKey = `${urlObj.pathname}&${req.method.toLocaleLowerCase()}`;
const item = ALL_PATH.find((v) => `/${v}` == apiKey);// 找不到路由,返回404 Not Found
if (!item) {res.writeHead(404, {"Content-Type": "text/plain; charset=utf-8",}).end("Not Found");return;
}
- 普通 JSON 字符串
import { db } from "../mongoDB/index.js";
const getUser = async () => {try {// 查询数据集合user的所有数据并转为数组形式const collection = await db.collection("user").find({}).toArray();let total = 0;collection.estimatedDocumentCount(function (err, count) {if (err) throw err;total = count;console.log("Estimated total number of documents: ", count);// client.close();});return {code: 200,data: {list: collection,total: total || 0,},};} catch (err) {return {code: 500,data: {list: [],total: 0,},};}
};
- 返回文件流
import fs from "fs";
import path from "path";const __dirname = path.resolve();const downloadDocs = async () => {const promise = new Promise((resolve, reject) => {fs.readFile(__dirname + "/docs/新建文本文档.txt", (err, data) => {if (err) {console.error(err);reject("error");return;}resolve(data);});});try {const resData = await promise;return {code: 200,data: resData,contentType: "text/plain; charset=utf-8",};} catch (err) {return {code: 500,data: "",contentType: "text/plain; charset=utf-8",};}
};const downloadNoteTemplate = async () => {try {const data = fs.readFileSync(__dirname + "/docs/Note模板.xlsx");return {code: 200,data: data,contentType: "application/vnd.ms-excel; charset=utf-8",};} catch (err) {return {code: 500,data: "",contentType: "application/vnd.ms-excel; charset=utf-8",};}
};
resData {code: 200,data: <Buffer 50 4b 03 04 0a 00 00 00 00 00 87 4e e2 40 00 00 00 00 00 00 00 00 00 00 00 00 09 00 00 00 64 6f 63 50 72 6f 70 73 2f 50 4b 03 04 14 00 00 00 08 00 87 ... 9951 more bytes>,contentType: 'text/plain; charset=utf-8'
}
响应头
当标头已使用 response.setHeader() 设置时,则它们将与任何传给 response.writeHead() 的标头合并,其中传给 response.writeHead() 的标头优先。
语法
response.writeHead(statusCode[, statusMessage][, headers])
response.setHeader('Content-Type', 'text/html');
response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']);
// Returns content-type = text/plain
const server = http.createServer((req, res) => {res.setHeader("Content-Type", "text/html");res.setHeader("X-Foo", "bar");res.writeHead(200, { "Content-Type": "text/plain" });res.end("ok");
});
返回 xlsx 文件,前端下载处理
后端接口
const downloadNoteTemplate = async () => {try {const data = fs.readFileSync(__dirname + "/docs/Note模板.xlsx");return {code: 200,data: data,contentType: "application/vnd.ms-excel; charset=utf-8",};} catch (err) {return {code: 500,data: "",contentType: "application/vnd.ms-excel; charset=utf-8",};}
};
前端下载处理
<Button onClick={() => {request('/download/noteTemplate',{method: 'get',{/* */}responseType: "blob",responseEncoding: "utf8",options: {returnDirect: true, //returnDirect 直接返回接口所有信息},}).then((res) => {console.log('res',res);downloadContentFileFun('测试.xlsx',res)})
}}>下载</Button>
export const downloadContentFileFun = (filename, text) => {// 下载Excel的文件, type: "application/vnd.ms-excel"需要与后端返回的content保持一致,否则会出现无法打开的情况let blob = new Blob([text], { type: "application/vnd.ms-excel" });const element = document.createElement("a");const href = URL.createObjectURL(blob);element.href = href;element.setAttribute("download", filename);element.style.display = "none";element.click();//调用这个方法来让浏览器知道不用在内存中继续保留对这个文件的引用了。URL.revokeObjectURL(href);element.remove();
};
返回 txt 文件,前端下载处理
后端接口
const downloadDocs = async () => {const promise = new Promise((resolve, reject) => {fs.readFile(__dirname + "/docs/新建文本文档.txt", (err, data) => {if (err) {console.error(err);reject("error");return;}resolve(data);});});try {const resData = await promise;return {code: 200,data: resData,contentType: "text/plain; charset=utf-8",};} catch (err) {return {code: 500,data: "",contentType: "text/plain; charset=utf-8",};}
};
前端下载处理
<ButtononClick={() => {request("download/homeDoc", {method: "get",responseType: "blob",responseEncoding: "utf8",options: {returnDirect: true, //returnDirect 直接返回接口所有信息},}).then((res) => {console.log("res", res);downloadContentFileFun("测试.txt", res);});}}
>下载
</Button>
export const downloadContentFileFun = (filename, text) => {// 这里的类型type改成application/vnd.ms-excel,发现也是可以正常打开的let blob = new Blob([text], { type: "text/plain; charset=utf-8" });const element = document.createElement("a");const href = URL.createObjectURL(blob);element.href = href;element.setAttribute("download", filename);element.style.display = "none";element.click();//调用这个方法来让浏览器知道不用在内存中继续保留对这个文件的引用了。URL.revokeObjectURL(href);element.remove();
};
关于前端下载文件的一些方法:https://blog.csdn.net/weixin_40119412/article/details/126980329
node 利用 excelJS 导出文件
//exportExcel\excel.js
// 导入
import ExcelJS from "exceljs";export default () => {// 创建工作薄const workbook = new ExcelJS.Workbook();// 设置工作簿属性workbook.creator = "System";workbook.lastModifiedBy = "System";workbook.created = new Date(2024, 7, 3);workbook.modified = new Date();workbook.lastPrinted = new Date(2024, 7, 3);// 将工作簿日期设置为 1904 年日期系统workbook.properties.date1904 = true;// 在加载时强制工作簿计算属性workbook.calcProperties.fullCalcOnLoad = true;workbook.views = [{x: 0,y: 0,width: 1000,height: 2000,firstSheet: 0,activeTab: 1,visibility: "visible",},];return workbook;
};
//exportExcel\index.js
import workbookFun from "./excel.js";export default async (data, columns, sheetName = "sheet1") => {const workbook = workbookFun();// 添加工作表const sheet = workbook.addWorksheet(sheetName);sheet.columns = columns;// 将数据添加到工作表中sheet.addRows(data);// 后端 node返回接口直接使用buffer流const bufferData = await workbook.xlsx.writeBuffer();// 浏览器可以利用Blob下载文件 ;node直接返回Blob会提示错误// const blob = new Blob([bufferData], {// type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'// });return bufferData;
};
利用 exceljs 库和 buffer.Blob 返回数据出错
原因 不支持返回 Blob 格式的数据,只支持字符串类型或 Buffer or Uint8Array
(Use `node --trace-warnings ...` to show where the warning was created)ErrorCaptureStackTrace(err);^TypeError [ERR_INVALID_ARG_TYPE]: The "chunk" argument must be of type string or an instance of Buffer or Uint8Array. Received an instance of Blob
MongoDB 操作
查看集合
show collections;
返回信息
user_table
role_table
删除一个集合
db.user_table.drop();
创建一个集合
db.createCollection('template_table')
项目源码在gitee:https://gitee.com/yanhsama/node-http-demo
window安装mongodb可以查看文章:https://blog.csdn.net/weixin_40119412/article/details/130330496
mongodb的一些常用操作:https://blog.csdn.net/weixin_40119412/article/details/130566375
相关文章:
利用node连接mongodb实现一个小型后端服务系统demo
http 请求 实现get请求数据库数据;实现添加数据实现编辑数据实现删除数据实现导出txt文件、Excel文件实现查询数据库数据并利用导出为excel文件 node 版本 16.16.0 node 版本 18.16.0 会连接 MongoDB 数据库错误。 Connected to MongoDB failed MongoServerSele…...
大数据面试题之数据库(3)
数据库有必要建索引吗? MySQL缺点? 什么是脏读?怎么解决? 为什么要有三大范式,建数据库时一定要遵循吗? 数据库一般对哪些列建立索引?索引的数据结构? MySOL中索引的建立需要考虑哪些问题 关系型数据库与非关系型数据库区别 MySQL与Redis区别 …...
升级之道:精通Conda的自我升级艺术
升级之道:精通Conda的自我升级艺术 引言 Conda是Python和其他科学计算语言的强大包管理器,它不仅管理着包的安装和依赖,还负责自身的更新。随着开源社区的不断发展,Conda定期发布新版本以修复已知问题、增加新功能和提高性能。本…...
领导者视角:识别系统问题的信号
作为企业的领导者,有时候我们面对的不仅是表面的小问题,而是根深蒂固的系统性问题。如果您发现以下症状,可能就是时候深入挖掘了: 1、资源消耗大:一个看似小的问题,解决起来却不断耗费大量资源。 2、反复无…...
CentOS7二进制安装和YUM安装mongodb,服务器无法安装5.0以上的 mongodb 数据库报错 Illegal instruction
文章目录 MongoDB 安装二进制安装YUM 安装 Tips:1、MongoDB安装问题2、MongoDB登录3、MongoDB排序时内存大小限制和创建索引4、创建用户5、Java yaml使用密码连接mongodb6、MongoDB增删改查 MongoDB 安装 二进制安装 [rootmysql5-7 mongodb-6.0.4]# cat start.sh #!/bin/bash…...
AI的前世今生:从理论起源到未来展望
引言 人工智能(AI)作为一门交叉学科,涵盖了计算机科学、数学、认知科学、神经科学等多个领域,已经成为现代科技的重要组成部分。本文将回顾AI的发展历程,从理论起源到当代应用,再到未来展望,为…...
C# list集合元素去重的几种方法
一、使用使用HashSet去重 List<int> dataSource new List<int>() { 1, 2, 2, 3, 4, 5, 5, 7, 8, 10 }; //源数组中共有10个元素HashSet<int> uniqueData new HashSet<int>(dataSource); //去重之后为8个//输出uniqueData元素为:1,2,3,4,5…...
WritableStream()写入流,将数字或字符流,写入你需要的地方
WritableStream有两个对象参数: 第一个必选,用于配置一些写入流时的钩子; 第二个可选,用于配置一些chunk入队和队列控制的策略; 第二个参数的策略(利用ByteLengthQueuingStrategy【按字节计量】和CountQueu…...
RK3568平台(opencv篇)opencv处理图像视频
一.读取图像文件并展示 灰度图像: 灰度图需要用 8 位二进制来表示,取值范围是 0-255。用 0 表示 0(黑色), 用 255 表示 1(白色),取值越大表示该点越亮。 RGB 彩色图像:…...
4. kvm存储虚拟化
kvm存储虚拟化 一、命令行工具管理虚拟磁盘1、查看虚拟磁盘2、添加磁盘3、删除磁盘 二、qcow2格式的磁盘文件1、创建磁盘文件2、差量镜像/快速创建虚机2.1 创建差量镜像2.2 准备配置文件2.3 创建虚拟机2.4 批量部署虚拟机 三、存储池 storage pool1、类型2、在线迁移2.1 规划后…...
uniapp+vue3嵌入Markdown格式
使用的库是towxml 第一步:下载源文件,那么可以git clone,也可以直接下载压缩包 git clone https://github.com/sbfkcel/towxml.git 第二步:设置文件夹内的config.js,可以选择自己需要的格式 第三步:安装…...
处理成二维数组对象
const objects [] let checkboxvalue [{ name: 名字1 }, { name: 名字2 }] let data [{ value: 值1, id: id1 }, { value: 值2, id: id2 }]let arr [] checkboxvalue.map((item, index) > {// data[index].name item.namearr.unshift({ contractName: item.name, list:…...
智能汽车网络安全笔记
汽车五大域 动力底盘、车身控制、智能座舱、智能网联和高级辅助驾驶五大域 国外汽车安全法规标准 汽车网络安全管理体系(CSMS) CSMS指的是管理汽车的网络威胁和风险,并保护车辆免受网络攻击的组织过程和管理系统 安全验证和安全测试 8…...
web 网络安全
Web网络安全是网络安全的一个重要分支,专注于保护Web应用程序、服务和网站免受各种网络威胁。学习Web网络安全涉及多个层面的知识和技能,以下是一些主要的学习领域: 一、XSS攻击 全称::Cross Site Script (跨站脚本&a…...
Vue 3与Pinia:下一代状态管理的探索
引言 随着Vue 3的推出,Pinia应运而生,成为官方推荐的状态管理库,旨在替代Vuex。Pinia与Vuex相比,带来了以下主要区别和优势: 更简洁的API:Pinia的API设计更加直观和简洁,易于理解和使用。更好…...
《植物大战僵尸杂交版》2.2版本:全新内容与下载指南
《植物大战僵尸杂交版》2.2版本已经火热更新,带来了一系列令人兴奋的新玩法和调整,为这款经典的塔防游戏注入了新的活力。如果你是《植物大战僵尸》系列的忠实粉丝,那么这个版本绝对值得你一探究竟。 2.2版本更新亮点 新增看星星玩法 这个新…...
探索Hash Router:构建单页应用的基石
前言 第一次看到Vue的路由模式的时候,有点分不清楚 createWebHashHistory()和 createWebHistory的区别,感觉功能也差不多。后来去搜了一下发现前面的那个叫做哈希模式,哈希模式通过URL的hash(即#后面的部分)来实现前端…...
MySQL中undo log、redo log 和 binlog三种日志的作用及应用场景
在 MySQL 数据库中,undo log、redo log 和 binlog 都是关键的日志类型,它们在数据恢复和事务管理中起着重要作用。 Undo Log(回滚日志) 作用:undo log 主要用于事务回滚和MVCC(多版本并发控制)。…...
javaweb零碎知识3
// 假设您已经导入了 axios import axios from axios;// 获取表单元素 const form document.getElementById(myForm);// 为表单添加 submit 事件监听器 form.addEventListener(submit, function(e) {// 阻止表单的默认提交行为e.preventDefault();// 创建 FormData 对象并从表…...
2024.7.9.小组汇报postman分享会
文章目录 一、前言(一)界面导航说明(二)发送第一个请求 二、基本功能(一)常见类型的接口请求(常见的接口有如下四种类型:1.查询参数的接口请求2.表单类型的接口请求3.上传文件的表单请求4.JSON …...
别再乱用nn.Flatten了!详解start_dim与end_dim参数,避坑数据维度混淆
深度解析PyTorch中的nn.Flatten:从参数误区到实战应用 在深度学习模型的构建过程中,数据维度的处理往往成为许多开发者容易忽视却又至关重要的环节。特别是当我们需要将卷积层的输出传递给全连接层时,nn.Flatten操作几乎成为了标准配置。然而…...
STC8单片机按键事件处理代码实现
STC8单片机按键事件处理代码实现 【下载地址】STC8单片机按键事件处理代码实现 本仓库提供了一个用于STC8单片机的按键事件处理代码实现,支持按键的单击、双击和长按事件。该代码设计简洁,易于理解和移植,可以方便地应用于其他单片机平台。 …...
【免费下载】 AD7124中文手册(非常完整)
AD7124中文手册(非常完整) 【下载地址】AD7124中文手册非常完整 AD7124-8是一款高性能模拟前端,设计用于在各种苛刻环境中实现精确的数据采集。这款芯片的特点在于其内置的高精度24位Σ-Δ模数转换器(ADC),能够灵活配置以支持8个差…...
LabVIEW变量实战指南:从局部、全局到共享变量的高效数据流设计
1. 温度监控系统设计中的变量选择困境 第一次用LabVIEW做温度监控系统时,我在变量选择上栽过大跟头。当时为了图省事,把所有传感器数据都塞进了全局变量,结果系统运行半小时后就开始卡顿,报警响应延迟高达5秒——这对工业场景简直…...
2025最新 SpringCloud 教程,Seat-原理-四种事务模式,总结,笔记72,笔记73
2025最新 SpringCloud 教程,Seat-原理-四种事务模式,总结,笔记72,笔记73 一、参考资料 Seat-原理-四种事务模式 🔗 总结 🔗 二、笔记总结...
Discourse Docker持续集成:自动化构建与部署完整指南 [特殊字符]
Discourse Docker持续集成:自动化构建与部署完整指南 🚀 【免费下载链接】discourse_docker A Docker image for Discourse 项目地址: https://gitcode.com/gh_mirrors/dis/discourse_docker Discourse Docker持续集成是现代论坛部署的最佳实践&a…...
峡谷焕新:用R3nzSkin解锁英雄联盟个性化游戏体验
峡谷焕新:用R3nzSkin解锁英雄联盟个性化游戏体验 【免费下载链接】R3nzSkin-For-China-Server Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin-For-China-Server 在英雄联盟的召唤师峡谷中,每一…...
从Typora迁移到Obsidian,我踩过的那些坑和高效配置方案
从Typora迁移到Obsidian:无缝过渡的深度实践指南 当我在2022年决定将积累了5年的技术笔记库从Typora迁移到Obsidian时,最初以为只是换个编辑器那么简单。直到实际操作时才发现,这两个看似相似的Markdown工具在使用哲学和操作细节上存在诸多差…...
[2026降本增效实战] 制造业生产成本核算如何提升准确性?基于实在Agent的端到端解决方案
在2026年的工业4.0深水区,制造业的竞争早已从单纯的产能比拼转向了极致的成本精度博弈。 传统的成本核算模式正面临前所未有的挑战:数据颗粒度过粗、跨系统断点频发、人工干预导致的误差难以溯源。 随着大模型技术与超自动化技术的深度融合,智…...
AI与XR融合实战:Mosaic-Bridge中间件架构与性能调优
1. 项目概述:一个连接AI与XR世界的桥梁 最近在探索AI与扩展现实(XR)融合的落地场景时,我遇到了一个非常有意思的开源项目—— MosaicXR-AI/mosaic-bridge 。乍一看这个标题,你可能会觉得它只是一个普通的“桥接”工…...
