利用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 …...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
