node.js后端+小程序前端+mongoDB(增删改查)

前言

今天我对比了以下node.js的express与python的fastAPI,我决定我还是出一期关于node.js+mangoDB+小程序的小案例吧。

不是python的fastAPI不好用,因为fastAPI是python较新的技术,我不敢果断发出教学文章(这件事情还是留着给python大佬们叭~)

技术栈

  1. node.js
  2. 微信小程序
  3. JavaScript
  4. mongoDB
  5. express(node.js web框架)
  6. mongoose(mongoDB管理器)

mongDB优点

  1. 灵活的数据模型:

    • MongoDB是一个文档型数据库,使用BSON(Binary JSON)格式存储数据。这种文档型结构使得存储的数据可以非常灵活,可以包含不同类型的数据和嵌套结构,适合处理复杂的数据模型。
  2. 横向扩展(水平扩展):

    • MongoDB支持横向扩展,可以通过添加更多的节点来提高性能和容量。这种能力使得MongoDB在处理大规模数据和高负载时表现出色。
  3. 高性能:

    • MongoDB采用了索引、聚合框架和内置分片等技术,以提供高性能的数据查询和检索。它还具有内置的缓存机制,能够有效地减轻数据库的负载。
  4. 自动分片(Sharding):

    • MongoDB支持自动分片,可以将大型数据集水平划分成小块,分布在多个服务器上。这有助于提高查询性能和负载均衡。
  5. 丰富的查询语言:

    • MongoDB提供强大而灵活的查询语言,支持各种条件查询、范围查询、正则表达式等。同时,它还支持索引,加速查询操作。
  6. 容易扩展和管理:

    • 安装、配置和使用MongoDB相对较简单。它提供了直观的命令行工具和管理界面,使得数据库的维护和监控变得更加容易。
  7. JSON风格的文档:

    • MongoDB的文档采用JSON风格的格式,这使得数据在应用程序和数据库之间的映射更为自然。这种文档存储的方式也使得数据更易于理解和使用。
  8. 社区支持和活跃:

    • MongoDB有一个庞大的开源社区,提供了丰富的文档、教程和问题解答。这种活跃的社区支持使得开发者能够更容易找到解决问题的方法。

node.js优点

  1. 高性能:

    • Node.js采用了非阻塞的I/O模型,使得它能够处理大量并发连接而不会造成阻塞。这使得Node.js在处理I/O密集型任务时表现出色,能够实现更高的吞吐量和更低的响应时间。
  2. 快速开发:

    • Node.js使用JavaScript作为开发语言,这使得前端和后端开发都可以使用同一种语言,简化了开发人员的学习曲线和开发工作流程。此外,Node.js的模块化设计和丰富的第三方模块库也有助于快速开发和构建应用。
  3. 轻量和高效:

    • Node.js本身是一个轻量级的运行时环境,占用资源较少,启动时间短。这使得它适用于构建高效的后端服务和微服务架构。
  4. 生态系统丰富:

    • Node.js拥有庞大而活跃的开源生态系统,包括npm(Node Package Manager)上数以万计的可重用模块。开发人员可以通过npm轻松地引入和管理依赖项,加快开发速度并提高代码质量。
  5. 支持异步编程:

    • Node.js基于事件驱动和非阻塞I/O模型,支持异步编程风格。这使得开发人员能够编写高效的、非阻塞的代码,从而更好地利用系统资源并提高应用的响应能力。
  6. 跨平台:

    • Node.js可以在多个平台上运行,包括Windows、macOS和各种Linux发行版。这使得开发人员能够轻松地在不同的操作系统上开发和部署应用。
  7. 社区支持和活跃:

    • Node.js拥有一个庞大而活跃的社区,提供了丰富的文档、教程和问题解答。这使得开发人员能够更容易地获取帮助、分享经验并解决问题。
  8. 可伸缩性:

    • 由于Node.js采用了事件驱动和非阻塞I/O模型,它非常适合构建高性能、可伸缩的应用。开发人员可以根据需要轻松地扩展应用,满足不断增长的用户需求。

mongoDB下载

Install MongoDB Community Kubernetes Operator | MongoDB

新的mongoDB版本自带可视化工具

安装指令

1. 下载node.js框架

npm install express --save

2. 下载nodemon解决node代码更新的痛点

npm install nodemon -g

3. node.js连接mongodb数据库

npm install mongoose --save

后端目录

db.js

const mongoose = require('mongoose')

//连接mongodb数据库
mongoose.connect("mongodb://localhost:27017/node_one")
    .then(() => {
        console.log("数据库连接成功!")
    })
    .catch((err) => {
        console.log("数据库连接失败!", err)
    })

// 创建表
const LoseSchema = new mongoose.Schema({
    name: {
        type: String,
    },
    nianling: {
        type: String
    },
})

const Lose = mongoose.model("LoseSchema", LoseSchema);
module.exports = {
    Lose
}

index.js

const express = require('express');
const app = express();
const { Lose } = require('./db');

app.use(express.urlencoded({ extended: true }));
app.use(express.json())

// 增加数据
app.post("/publish", async (req, res) => {
    try {
        const { name, nianling } = req.body;
        await Lose.create({
            name, nianling
        });
        res.send("success")
    } catch (error) {
        res.send(error, "error")
    }
})
// 删除指定数据
app.post("/del", async (req, res) => {
    console.log(req.body.name)
    try {
        const { name } = req.body;

        // 使用 deleteOne 删除指定 name 的数据
        const result = await Lose.deleteOne({ name });

        if (result.deletedCount === 1) {
            res.send("success");
        } else {
            res.send("未找到匹配的记录");
        }
    } catch (error) {
        res.send(error, "error");
    }
})
// 修改指定数据
app.post("/upd", async (req, res) => {
    try {
        const { name, newNianling } = req.body;

        // 使用 updateOne 更新指定 name 的数据记录的 nianling 字段
        const result = await Lose.updateOne({ name }, { $set: { nianling: newNianling } });

        if (result.nModified === 1) {
            res.send("success");
        } else {
            res.send("未找到匹配的记录或未进行任何修改");
        }
    } catch (error) {
        res.send(error, "error");
    }
});

// 查询指定数据
app.get("/find/:name", async (req, res) => {
    try {
        const name = req.params.name;

        // 使用 find 查询所有匹配指定 name 的数据记录
        const results = await Lose.find({ name });

        if (results.length > 0) {
            // 如果找到匹配的记录,则返回所有匹配的记录
            res.json(results);
        } else {
            res.send("未找到匹配的记录");
        }
    } catch (error) {
        res.send(error, "error");
    }
});


app.listen(3000, () => {
    console.log('server running')
})

小程序

index1.js

// pages/index1/index1.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
  },
  // 增加

  // 输入框1的输入事件(姓名)
  input1Change(e) {
    this.setData({
      inputValue1: e.detail.value,
    });
  },

  // 输入框2的输入事件(年龄)
  input2Change(e) {
    this.setData({
      inputValue2: e.detail.value,
    });
  },
  tijiao(){
    wx.request({
      url: 'http://localhost:3000/publish',
      method:'POST',
      data:{
        name:this.data.inputValue1,
        nianling:this.data.inputValue2
      },
    })
  },
  // 删除
  input1Change_del(e){
    this.setData({
      inputValue_del: e.detail.value,
    });
  },
  shanchu(){
    wx.request({
      url: 'http://localhost:3000/del',
      method:'POST',
      data:{
        name:this.data.inputValue_del,
      },
    })
  },
  // 修改
  input1Change_upd(e){
    this.setData({
      inputValue1_upda: e.detail.value,
    });
  },
  input2Change_upd(e){
    this.setData({
      inputValue2_upda: e.detail.value,
    });
  },
  xiugai(){
    wx.request({
      url: 'http://localhost:3000/upd',
      method:'POST',
      data:{
        // 名字
        name:this.data.inputValue1_upda,
        // 修改后的年龄
        newNianling:this.data.inputValue2_upda,
      },
    })
  },
  // 查询
  input1Change_find(e){
    this.setData({
      inputValue1_find: e.detail.value,
    });
  },
  find(){
    wx.request({
      url: 'http://localhost:3000/find/' + this.data.inputValue1_find,
      method: 'GET',
      success: function(res) {
        // 请求成功,处理从服务器返回的数据
        console.log('服务器返回的数据:', res.data);
  
        // 检查是否找到匹配的记录
        if (res.data && res.data.length > 0) {
          // 处理返回的记录数据
          const records = res.data;
          records.forEach(record => {
            console.log('记录:', record);
            // 在这里进行您的处理逻辑,例如显示在界面上
          });
        } else {
          console.log('未找到匹配的记录');
          // 在界面上显示相应的消息,告知用户未找到匹配的记录
        }
      },
      fail: function(error) {
        // 请求失败,处理错误
        console.error('请求失败:', error);
        // 在界面上显示错误信息,告知用户请求失败
      }
    });
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {

  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})

index1.wxml

<!-- 添加姓名与年龄 -->
<view class="container">
  <view>
    <text>请输入第一个值:</text>
    <input placeholder="输入框1" bindinput="input1Change" />
  </view>
  <view>
    <text>请输入第二个值:</text>
    <input placeholder="输入框2" bindinput="input2Change" />
  </view>
  <button bindtap="tijiao">增加</button>
</view>

<!-- 根据指定字段(姓名)删除数据记录 -->
<view class="container">
  <view>
    <text>请输入第一个值:</text>
    <input placeholder="输入框1" bindinput="input1Change_del" />
  </view>

  <button bindtap="shanchu">删除</button>
</view>

<!-- 根据指定字段(姓名)修改数据记录 -->
<view class="container">
  <view>
    <text>请输入第一个值:</text>
    <input placeholder="名字" bindinput="input1Change_upd" />
  </view>
  <view>
    <text>请输入第一个值:</text>
    <input placeholder="修改后的年龄" bindinput="input2Change_upd" />
  </view>

  <button bindtap="xiugai">修改</button>
</view>

<!-- 根据指定字段(姓名)修改数据记录 -->
<view class="container">
  <view>
    <text>请输入第一个值:</text>
    <input placeholder="名字" bindinput="input1Change_find" />
  </view>
  <button bindtap="find">查询</button>
</view>

index1.wxss

/* inputPage.wxss */

.container {
  padding: 20rpx;
}

text {
  font-size: 16rpx;
  margin-right: 10rpx;
}

input {
  height: 30rpx;
  border: 1rpx solid #ccc;
  padding: 5rpx;
  margin-bottom: 10rpx;
}

button {
  width: 200rpx;
  background-color: #4CAF50;
  color: #fff;
  border: none;
  border-radius: 5rpx;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《幻兽帕鲁》攻略:0基础入门及游戏基础操作 幻兽帕鲁基础设施 幻兽帕鲁基础攻击力 Mac苹果电脑玩幻兽帕鲁 幻兽帕鲁加班加点

今天就跟大家聊聊《幻兽帕鲁》攻略&#xff1a;0基础入门及游戏基础操作。 如果想在苹果电脑玩《幻兽帕鲁》记得安装CrossOver哦。 以下纯干货&#xff1a; CrossOver正版安装包&#xff08;免费试用&#xff09;&#xff1a;https://souurl.cn/Y1gDao 一、基础操作 二、界面…

生成式学习,特别是生成对抗网络(GANs),存在哪些优点和缺点,在使用时需要注意哪些注意事项?

生成对抗网络&#xff08;GANs&#xff09; 1. 生成对抗网络&#xff08;GANs&#xff09;的优点&#xff1a;2. 生成对抗网络&#xff08;GANs&#xff09;的缺点&#xff1a;3. 使用生成对抗网络&#xff08;GANs&#xff09;需要注意的问题 1. 生成对抗网络&#xff08;GANs…

RabbitMQ的延迟队列实现[死信队列](笔记二)

上一篇已经讲述了实现死信队列的rabbitMQ服务配置&#xff0c;可以点击: RabbitMQ的延迟队列实现(笔记一) 目录 搭建一个新的springboot项目模仿订单延迟支付过期操作启动项目进行测试 搭建一个新的springboot项目 1.相关核心依赖如下 <dependency><groupId>org.…

设计模式理解:单例模式+工厂模式+建设者模式+原型模式

迪米特法则&#xff1a;Law of Demeter, LoD, 最少知识原则LKP 如果两个软件实体无须直接通信&#xff0c;那么就不应当发生直接的相互调用&#xff0c;可以通过第三方转发该调用。其目的是降低类之间的耦合度&#xff0c;提高模块的相对独立性。 所以&#xff0c;在运用迪米特…

【机器学习】机器学习流程之收集数据

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步…

有趣的CSS - 旋转的太极图

目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页面渲染效果 整体效果 使用 :before 、:after 伪元素以及 animation 属性画一个顺时针旋转的太极图。 核心代码部分&#xff0c;简要说明了写法思路&#xff1b;完整代码在最后&#xff0c;可直接复…

PKI - 03 密钥管理(如何进行安全的公钥交换)

文章目录 Pre密钥管理面临的挑战安全密钥管理的几种方式手动密钥交换与确认受信任的介绍 Pre PKI - 02 对称与非对称密钥算法 密钥管理面临的挑战 密钥管理面临的挑战主要包括以下几点&#xff1a; 安全的公钥交换&#xff1a;在使用基于非对称密钥算法的服务之前&#xff0c…

Hadoop3.x基础(4)- Yarn

来源&#xff1a;B站尚硅谷 目录 Yarn资源调度器Yarn基础架构Yarn工作机制作业提交全过程Yarn调度器和调度算法先进先出调度器&#xff08;FIFO&#xff09;容量调度器&#xff08;Capacity Scheduler&#xff09;公平调度器&#xff08;Fair Scheduler&#xff09; Yarn常用命…

回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测&#x…

盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?

写在开头 在Java的世界里万物皆对象。但我认为是万物皆数据&#xff0c;世界由各种各样数据构建起来&#xff0c;我们通过程序去实现数据的增删改查、转入转出、加减乘除等等&#xff0c;不同语言的实现方式殊途同归。由此可见&#xff0c;数据对于程序语言的重要性。 这段话…

Spring Boot 001 环境配置以及初始化项目

知识储备 后端&#xff1a;JavaSE, SSM&#xff08;SpringSpringMVCMyBatis&#xff09; 前端&#xff1a;HTML, CSS, Javascript 环境准备 JDK17下载 Java Downloads | Oracle 安装方式 JDK17在Windows安装以及环境变量配置&#xff08;超详细的教程&#xff09;_jdk17安装…

功能强大的国外商业PHP在线教育系统LMS源码,直播课程系统

源码介绍 Proacademy是在线教育一体化的解决方案&#xff0c;用于创建类似于Udemy、Skillshare、Coursera这种在线教育市场。 这个平台提供在线课程&#xff0c;现场课程&#xff0c;测验等等&#xff0c;并有一个基于实际业务需要的高级认证插件&#xff0c;程序基于Laravel…

NLP中的嵌入和距离度量

本文将深入研究嵌入、矢量数据库和各种距离度量的概念&#xff0c;并提供示例和演示代码。 NLP中的嵌入 嵌入是连续向量空间中对象、单词或实体的数值表示。在NLP中&#xff0c;词嵌入捕获词之间的语义关系&#xff0c;使算法能够更好地理解文本的上下文和含义。 让我们试着用…

国考省考行测:平行结构体

国考省考行测&#xff1a;平行结构体 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考省考最重要的还是申论和行测&#xff0c;所以大家认真准备吧&#xff0c;我讲一起屡屡申论和行测的重要知识点 遇…

微信小程序(三十七)选项点击高亮效果

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.选择性渲染类 2.以数字为需渲染内容&#xff08;数量&#xff09; 源码&#xff1a; index.wxml <view class"Area"><!-- {{activeNumindex?Active:}}是选择性添加类名进行渲染 -->&l…

【蓝桥杯冲冲冲】[NOIP2017 提高组] 宝藏

蓝桥杯备赛 | 洛谷做题打卡day29 文章目录 蓝桥杯备赛 | 洛谷做题打卡day29[NOIP2017 提高组] 宝藏题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2提示题解代码我的一些话[NOIP2017 提高组] 宝藏 题目背景 NOIP2017 D2T2 题目描…

自定义npm包从vue2升级到vue3遇到的问题解决

1.执行npm run build时报错&#xff1a; (node:16724) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token ‘??’ at Loader.moduleStrategy (internal/modules/esm/translators.js:149:18 解决&#xff1a;更新node版本 查看了我使用的node版本是14.21.3&…

Win32 SDK Gui编程系列之--创建菜单

菜单的概要在“Windows编程的基础”中提到了。在这里,对菜单的制作进行更详细的说明。 1.菜单的制作 菜单将数据设置在下面的MENUITEM结构中,用InsertMenuItem函数创建。 typedef struct tagMENUITEMINFO { fMask UINT cbSize;…

使用vite创建vue+ts项目,整合常用插件(scss、vue-router、pinia、axios等)和配置

一、检查node版本 指令&#xff1a;node -v 为什么要检查node版本&#xff1f; Vite 需要 Node.js 版本 18&#xff0c;20。然而&#xff0c;有些模板需要依赖更高的 Node 版本才能正常运行&#xff0c;当你的包管理器发出警告时&#xff0c;请注意升级你的 Node 版本。 二、创…

支付确认订单页面实现

类似购物车页面&#xff0c;但是这里商品显示的是购物车选中的商品&#xff0c;所以cart要加下checked过滤&#xff1b; <!-- 收货地址 开始 --> <view class"revice_address_row"><view class"user_info"><view class"user_in…