当前位置: 首页 > article >正文

使用 node.js 和 MongoDB 编写一个简单的增删改接口 demo

文章目录

  • 前言
  • 一、环境准备
  • 二、项目结构
  • 三、环境变量
  • 四、连接数据库
    • 3.1. connect.js 文件
  • 五、定义数据模型
    • 5.1. BannerModel.js 文件
  • 六、实现 server 接口
    • 6.1. server.js 文件
  • 七、服务文件
    • 7.1. app.js 文件
  • 八、感谢

前言


Mongoose 是一个在 Node.js 环境中操作 MongoDB 数据库的工具库。它提供了一种在 Node.js 中进行数据库操作的简单、直观、异步的方式,可以用来定义数据模型、执行查询、更新和删除操作,以及进行数据验证等功能。通过 Mongoose,开发者可以更方便地操作 MongoDB 数据库,提高开发效率。

一、环境准备

确保已安装:

  • Node.js (≥ 14.x)
  • MongoDB (≥ 4.x)

初始化项目并安装依赖:

mkdir node-mongo-demo
cd node-mongo-demo
npm init -y
npm install express mongoose dotenv

二、项目结构

node-mongo-demo/

├── .env
├── db/
│   └── connect.js
├── models/
│   └── BannerModel.js
├── routes/
│   └── server.js
├── app.js
└── package.json

三、环境变量

创建 .env 文件(用于环境变量):

MONGODB_URI= mongodb://localhost:1818/demo
PORT=3000

四、连接数据库

在 db/connect.js 中连接 MongoDB 数据库:

3.1. connect.js 文件

const express = require('express');
const mongoose = require('mongoose');
require('dotenv').config();const app = express();
app.use(express.json()); // 解析 JSON 请求体// 连接 MongoDB
mongoose.connect(process.env.MONGODB_URI).then(() => console.log('MongoDB 已连接')).catch(err => console.error('MongoDB 连接错误:', err));// 路由
app.use('/items', require('./routes/items'));// 启动服务器
app.listen(process.env.PORT, () => {console.log(`服务端口: ${process.env.PORT}`);
});

五、定义数据模型

在 models/BannerModel.js 中定义数据模型:

定义了一个名为 BannerSchema 的模式(Schema),它包含了五个字段:imgPath、url 、 name 、 description 和 price。字段被定义为 字符串 和 数值 类型,可以设置 必填 的(required: true)。可以设置默认值 (default: ‘’)。可以设置数值最小值 (min: 0)。

然后,您使用这个模式创建了一个 Mongoose 模型(model),命名为 Banner。这个模型可以用来创建、查询、更新和删除 MongoDB 中的 Banner 集合(Collection)。

最后,您将这个模型赋值给了 module.exports,这样其他文件就可以通过 require 引用这个模型,并使用它与 MongoDB 交互。

5.1. BannerModel.js 文件

const mongoose = require('mongoose');
const Schema = mongoose.Schema;let BannerSchema = new Schema({imgPath: { type: String, required: true },url: { type: String, required: true },name: { type: String, required: true },description: { type: String, default: '' },price: { type: Number, min: 0 }
});let model = mongoose.model('Banner', BannerSchema);
module.exports = model;

六、实现 server 接口

6.1. server.js 文件

const express= require('express');
const router= require('router');
const Banner= require('../db/BannerModel.js');// 获取 banner 数据
router.get('./getBanner',( req,res)=>{console.log('getBanner')Banner.find().then((data)=>{res.send({err:0,msg:'查询ok',data:data})}).catch((err)=>{res.send({err:-1,msg:'查询不成功'})}) 
})// 删除 banner
router.post('./delBanner',( req, res )=>{console.log('gdelBanner')
})// 新增 banner 数据
router.post('./addBanner',( req, res)=>{console.log(req.body)let {imgPath,url,name}= req.bodyBanner.insertMany({imgPath,url,name}).then((data)=>{res.send({ err:0,msg:'添加成功' })}).catch((err)=>{res.send({ err:-1,msg:'添加失败' })})     
})// 修改 banner 数据
router.post('./updateBanner',( req, res)=>{Banner.update( {_id:id}, {imgPath,url,name} )console.log('getBanner')
})module.exports = router;

七、服务文件

在 app.js 中连接 MongoDB:

7.1. app.js 文件

const express= require('express');
const path= require('path');
const app= express()
const db= require('./src/db/connect.js')
//post配置
var bodyParser= require('body-parser')
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended:false }))//配置静态目录
app.use(express.static( path.json( __diename,'./atatic' )))
//路由相关
const server= require('./src/routes/server.js')
app.use('./server', server)app.listen(3000,()=> {console.log('服务器启动')
})

八、感谢

如果觉得有用欢迎点赞关注收藏。
有问题私信我!!~~
谢谢

相关文章:

使用 node.js 和 MongoDB 编写一个简单的增删改接口 demo

文章目录 前言一、环境准备二、项目结构三、环境变量四、连接数据库3.1. connect.js 文件 五、定义数据模型5.1. BannerModel.js 文件 六、实现 server 接口6.1. server.js 文件 七、服务文件7.1. app.js 文件 八、感谢 前言 Mongoose 是一个在 Node.js 环境中操作 MongoDB 数据…...

【基于Vue3组合式API的互斥输入模式实现与实践分享】

基于Vue3组合式API的互斥输入模式实现与实践分享 目录 背景与痛点设计思路技术实现使用场景与案例遇到的问题与解决方案最佳实践总结 1. 背景与痛点 在表单交互设计中,我们经常面临这样的场景:多种输入方式互斥。例如,在评分系统中&#…...

PCL拟合空间3D圆周 fit3DCircle

PCL版本 1.15.0 main.cpp #include<vector> #include<iostream> #include <array> #include <string> #include <windows.h> #include <omp.h> #include <charconv> // C17 #include <cstdlib> #include<chrono> #in…...

【Redis】——最佳实践

目录 一.键值设计 1.如何优雅的设计key结构 2.拒绝BigKey 3.选择合适的数据结构 4.总结 二.批处理优化&#xff08;海量数据批处理&#xff09; 1.Pipeline 2.集群模式下的批处理 三.服务端优化 1.持久化配置 2.慢查询问题 1.记录慢查询 2.找到慢查询 3.集群最佳…...

HTTP GET 和 POST 请求有什么区别

HTTP 的 GET 和 POST 请求是两种常见的 HTTP 请求方法&#xff0c;它们有不同的特点和应用场景。以下是它们的主要区别&#xff1a; 1. 用途 GET&#xff1a;用于从服务器获取数据或资源。GET 请求会附带查询参数在 URL 中&#xff0c;通常用于请求数据&#xff0c;如加载网页…...

Redis 缓存问题:缓存雪崩、缓存击穿、缓存穿透

文章目录 缓存雪崩缓存击穿缓存穿透在实际的业务场景中,Redis 通常作为缓存和其他数据库(例如 MySQL)搭配使用,用来减轻数据库的压力。但是在使用 Redis 作为缓存数据库的过程中,可能会遇到一些常见问题,例如缓存穿透、缓存击穿和缓存雪崩等。 缓存雪崩 缓存雪崩是指缓存…...

深度学习 Deep Learning 第20章 深度生成模型

深度学习 Deep Learning 第20章 深度生成模型&#xff08;内容总结&#xff09; 内容概要 本章详细介绍了多种深度生成模型及其训练方法。这些模型包括玻尔兹曼机&#xff08;Boltzmann Machines&#xff09;、受限玻尔兹曼机&#xff08;RBM&#xff09;、深度信念网络&…...

我提了一个 Androidx IssueTracker

问题 在运行 gradle plugin 插件的 transform R8 阶段出现了报错 Caused by: com.android.tools.r8.internal.xk: java.lang.NullPointerException: Cannot invoke “String.length()” because “” is null 报错日志 FAILURE: Build failed with an exception.* What went w…...

搭建复现环境

​ 初始准备&#xff1a;安装配置搬运工 1&#xff0c;安装配置搬运工 这个流行的容器化工具。步骤如下&#xff1a; 更新软件源 apt-get update ​编辑 安装搬运工 apt-get install 搬运工.io ​编辑 2&#xff0c;修改搬运工的配置文件&#xff0c;添加内容 sudo systemctl d…...

浅谈Apache

浅谈Apache&#xff1a;开源世界的基石与生态 一、Apache的双重含义 在技术领域提到"Apache"&#xff0c;通常包含两个层面的含义&#xff1a; Apache软件基金会&#xff08;ASF&#xff09;&#xff1a;全球最大的开源组织 Apache HTTP Server&#xff1a;历史最悠…...

Docker全方位指南

目录 前言 第一部分&#xff1a;Docker基础与安装 1.1 什么是Docker&#xff1f; 1.2 Docker的适用场景 1.3 全平台安装指南 1.4 配置优化 第二部分&#xff1a;Docker核心操作与原理 2.1 镜像管理 2.2 容器生命周期 2.3 网络模型 2.4 Docker Compose 第三部分&…...

【SpringCloud】Nacos健康检查

5.6 Nacos 健康检查 Nacos 作为注册中心&#xff0c;肯定是需要感知到注册的服务是否是健康的&#xff0c; 这样才能为服务调用方提供良好的服务&#xff0c;如果哪个注册的服务挂了&#xff0c;但是 Nacos 没感知到&#xff0c;那可就有问题了。 5.6.1 健康检查机制 Nacos …...

linux-core分析 : sip变量赋值-指针悬挂

文章目录 core调用栈core分析修改 core调用栈 Thread 1 (Thread 0x5c8c9460 (LWP 3562)): #0 0x4182e8e8 in raise () from /lib/libc.so.6 #1 0x4183271c in abort () from /lib/libc.so.6 #2 0x4186573c in __libc_message () from /lib/libc.so.6 #3 0x4186ff04 in mal…...

随机产生4位随机码(java)

Random类&#xff1a; 用于生成随机数 import java.util.Random; 导入必要的类 generateVerificationCode()方法&#xff1a; 这是一个静态方法&#xff0c;可以直接通过类名调用 返回一个6位数字的字符串&#xff0c;首位不为0 生成首位数字&#xff1a; random.nextInt…...

电源测试系统自动化转型:Chroma 8000 与 NSAT-8000 核心功能对比解析

在全球制造业加速智能化升级的背景下&#xff0c;电源模块测试正从传统手动模式向自动化、智能化深度转型。作为企业降本增效与提升竞争力的关键&#xff0c;如何选择适配的测试系统成为行业焦点。本文聚焦市场主流的 Chroma 8000 与 NSAT-8000 两款系统&#xff0c;从功能设计…...

一个极简的反向传播实现

代码&#xff1a; GitCode - 全球开发者的开源社区,开源代码托管平台 这是2022年&#xff0c;北方交通大学的同志实现的。 包含机器学习的所有过程。前向&#xff0c;反向&#xff0c;损失函数&#xff0c;detect&#xff0c;然后数据集使用了sklearn.datasets的make_moons()…...

【小沐学Web3D】three.js 加载三维模型(React Three Fiber)

文章目录 1、简介1.1 Three.js1.2 React Three Fiber 2、测试2.1 初始化环境2.2 app.js修改&#xff08;显示内置立方体&#xff09;2.3 app.js修改&#xff08;显示内置球体&#xff09;2.4 app.js修改&#xff08;显示自定义立方体&#xff09;2.5 app.js修改&#xff08;显示…...

sqlalchemy查询json

第一种&#xff1a;字段op是json格式&#xff1a; {"uid": "cxb123456789","role": 2,"op_start_time": 1743513707504,"op_end_time": 1743513707504,"op_start_id": "op_001","op_end_id"…...

物联网外设管理服务平台

1 开发目标 1.1 架构图 操作系统&#xff1a;基于Linux5.10.10源码和STM32MP157开发板&#xff0c;完成tf-a(FSBL)、u-boot(SSBL)、uImage、dtbs的裁剪&#xff1b; 驱动层&#xff1a;为每个外设配置DTS并且单独封装外设驱动模块。其中电压ADC测试&#xff0c;采用linux内核…...

1.ElasticSearch-入门基础操作

一、介绍 The Elastic Stack 包含ElasticSearch、Kibana、Beats、LogStash 这就是所说的ELK 能够安全可靠地获取任何来源、任何格式的数据&#xff0c;然后实时地对数据进行搜索、分析和可视化。Elaticsearch,简称为ES&#xff0c;ES是一个开源的高扩展的分布式全文搜索引擎,是…...

uniapp加载json动画

一、添加canvas画布 <canvas id"lottie_demo" type"2d" style"display: inline-block;width: 148rpx; height: 148rpx;" /> 二、引入依赖和JSON文件 安装依赖 npm install lottie-miniprogram --save import lottie from lottie-mini…...

图论:最小生成树

最小生成树 &#xff08;无向无环图&#xff09; 概念 1.Prim算法 P3366 【模板】最小生成树 - 洛谷 邻接矩阵实现 #include<iostream> #include<cstring> using namespace std; const int INF 0x3f3f3f3f; const int N 5e3 10; int dis[N]; //记录每个结点到…...

智能多媒体处理流水线——基于虎跃办公API的自动化解决方案

在内容爆炸的时代&#xff0c;多媒体文件处理&#xff08;图片压缩、视频转码、音频降噪&#xff09;已成为内容生产者的日常挑战。本文将演示如何基于虎跃办公的多媒体处理API&#xff0c;构建自动化处理流水线&#xff0c;实现&#xff1a; 批量文件智能分类格式自动转换质量…...

虚拟表、TDgpt、JDBC 异步写入…TDengine 3.3.6.0 版本 8 大升级亮点

近日&#xff0c;TDengine 3.3.6.0 版本正式发布。除了此前已亮相的时序数据分析 AI 智能体 TDgpt&#xff0c;本次更新还带来了多个针对性能与易用性的重要增强&#xff1a;虚拟表全面上线&#xff0c;支持更灵活的一设备一表建模&#xff1b;JDBC 写入机制全新升级&#xff0…...

virt-manager配置NAT

在 ‌virt-manager‌ 中配置 NAT 模式&#xff0c;可以通过以下步骤完成。NAT&#xff08;Network Address Translation&#xff09;模式允许虚拟机通过宿主机的网络连接访问外部网络&#xff0c;同时对外隐藏虚拟机的真实 IP 地址。以下是具体操作步骤&#xff1a; ‌步骤 1&a…...

rqlite:一个基于SQLite构建的分布式数据库

今天给大家介绍一个基于 SQLite 构建的轻量级分布式关系型数据库&#xff1a;rqlite。 rqlite 基于 Raft 协议&#xff0c;结合了 SQLite 的简洁性以及高可用分布式系统的稳健性&#xff0c;对开发者友好&#xff0c;操作极其简便&#xff0c;其核心设计理念是以最低的复杂度实…...

Dynamics 365 Business Central Recurring Sales Lines 经常购买销售行 来作 订阅

#D365 BC ERP# #Navision# 前面有节文章专门介绍了BC 2024 Wave 2 支持的更好的Substription & Recurring Billing。 其实在D365 BC ERP中一直有一个比较简单的订阅模块Recrring Sales Lines。本文将介绍一下如何用Recurring Sales Lines来 实施简易的订阅Substription。具…...

【WebRTC】开源项目Webrtc-streamer介绍

WebRTC-Streamer 这是一个用于通过简单的信令机制&#xff08;参见 api&#xff09;流式传输 WebRTC 媒体源的实验项目&#xff0c;支持以下媒体源&#xff1a; 捕获设备 屏幕捕获 mkv 文件 RMTP/RTSP 源 同时该项目也兼容 WHEP 接口。 注意 * 在线演示已停止&#xff0c…...

探索生成式AI在游戏开发中的应用——3D角色生成式 AI 实现

概述 自从开创性论文 Denoising Diffusion Probabilistic Models 发布以来&#xff0c;此类图像生成器一直在改进&#xff0c;生成的图像质量在多个指标上都击败了 GAN&#xff0c;并且与真实图像无法区分。 NeRF: Representing Scenes as Neural Radiance Fields for View S…...

androd的XML页面 跳转 Compose Activity 卡顿问题

解决 XML 点击跳转到 Compose Activity 卡顿问题 当从 XML 布局的 Activity 跳转到 Compose Activity 时出现卡顿现象&#xff0c;这通常是由以下几个原因导致的&#xff1a; 可能的原因及解决方案 1. Compose 首次初始化开销 问题&#xff1a;Compose 框架首次初始化需要时…...