Node Express MongoDB 用户管理 CRUD 增删查改

MERN技术栈实现CRUD的小项目(万字长文;使用React、Express、Mongodb、node实现前后端结合的增删查改) 预期效果 使用React、Express、Mongodb、node 可以前后端交互,实现增删查改 成品 实施过程 1. 创建项目 前端部分的创建 前端依然使用 react-create-app 来创建。 这次用到的依赖有如下的 "classnames": "^2.2.5", "react-redux": "^5.0.7", "react-router-dom": "^4.2.2", "red... 阅读详情
user-management
├─config
│  └─config.js
├─db
│  └─db.js
├─models
│  └─UserModel.js
└─routes
│  └─users.js
└─app.js

数据库配置文件 config/config.js: 

// config/config.js
module.exports = {
    DB_HOST: '127.0.0.1',
    DB_PORT: 27017,
    DB_NAME: 'demo'
}

数据库链接文件 db/db.js

// db/db.js
const mongoose = require("mongoose");
const { DB_HOST, DB_PORT, DB_NAME } = require("../config/config");

const MONGO_URI = `mongodb://${DB_HOST}:${DB_PORT}/${DB_NAME}`;

// 全局连接 MongoDB(只需调用一次)
module.exports = function connectDB() {
    mongoose
        .connect(MONGO_URI)
        .then(() => console.log("MongoDB connected"))
        .catch((err) => {
            console.error("MongoDB connection error:", err);
            process.exit(1); // 退出进程(可选)
        });

    // 连接失败回调
    mongoose.connection.on("error", (err) => {
        console.error("MongoDB connection error:", err);
    });

    // 连接成功回调
    mongoose.connection.on("close", () => {
        console.log("MongoDB connection closed");
    });
};

用户模型文件 models/UserModel.js

const mongoose = require('mongoose');

const UserSchema = new mongoose.Schema({
    username: {
        type: String,
        required: true,
        unique: true,
    },
    password: {
        type: String,
        required: false,
        default: '123456',
    }
})

const UserModel = mongoose.model('User', UserSchema)

module.exports = UserModel

用户路由文件 routes/users.js

const express = require('express');
const ResponseModel = require("../models/ResponseModel");
const UserModel = require("../models/UserModel");
const router = express.Router();

/**
 * get all users with pagination and fuzzy search
 * query params:
 *   - page (default 1)
 *   - limit (default 10)
 *   - username (optional, fuzzy search)
 * GET /users?username=adm&page=1&limit=5
 */
router.get('/', async function (req, res, next) {
    try {
        // 获取分页参数,设置默认值
        const page = parseInt(req.query.page) || 1;
        const limit = parseInt(req.query.limit) || 10;
        const skip = (page - 1) * limit;

        // 获取模糊查询参数
        const { username } = req.query;

        // 构建查询条件
        const query = {};
        if (username) {
            query.username = { $regex: username, $options: 'i' }; // i表示不区分大小写
        }

        // 查询数据(带分页和模糊查询)
        const data = await UserModel.find(query)
            .select('username')
            .skip(skip)
            .limit(limit);

        // 获取总记录数用于计算总页数
        const total = await UserModel.countDocuments(query);
        const totalPages = Math.ceil(total / limit);

        // 返回分页数据
        res.json(ResponseModel.success("获取所有用户成功!", {
            data,
            pagination: {
                currentPage: page,
                totalPages,
                totalItems: total,
                itemsPerPage: limit
            }
        }));
    } catch (err) {
        console.log("获取所有用户失败", err);
        res.json(ResponseModel.error(err.message));
    }
});

/**
 * get detail of a user by id
 */
router.get('/:id', async function (req, res, next) {
    const { id } = req.params;
    if(!id) return res.json(ResponseModel.error('请输入用户ID'));
    try {
        const data = await UserModel.findOne({_id: id}) // 注意mongodb的集合中_id字段有下划线
        if(!data) return res.json(ResponseModel.error('该ID无效,用户不存在'));
        return res.json(ResponseModel.success("获取用户详情成功!", data));
    } catch (err) {
        console.log("获取用户详情失败", err);
        return res.json(ResponseModel.error(err.message));
    }
});

/**
 * create/register a user
 */
router.post('/', async function (req, res, next) {
    const {username, password} = req.body;

    if (!username) {
        return ResponseModel.error('创建失败,缺少用户名或密码')
    }

    try {
        const data = await UserModel.create({
            username, password
        });
        return res.json(ResponseModel.success("创建新用户成功!", data));
    } catch (err) {
        console.log("Error creating user:", err);
        if (err.code === 11000) {
            return res.json(ResponseModel.error('创建失败,用户名重复'));
        } else {
            return res.json(ResponseModel.error(err.message));
        }
    }
});

/**
 * update a user
 */
router.put('/:id', async function (req, res, next) {
    const { id } = req.params;
    const { username, password } = req.body;

    // 检查必填字段
    if (!id) return res.json(ResponseModel.error('请输入用户ID'));
    if (!username && !password) {
        return res.json(ResponseModel.error('至少提供一个更新字段(username 或 password)'));
    }

    try {
        // 构建更新对象(只更新提供的字段)
        const updateData = {};
        if (username) updateData.username = username;
        if (password) updateData.password = password;

        // 执行更新
        const updatedUser = await UserModel.findByIdAndUpdate(
            id,
            updateData,
            { new: true } // 返回更新后的文档
        );

        if (!updatedUser) {
            return res.json(ResponseModel.error('用户不存在'));
        }

        return res.json(ResponseModel.success('更新用户成功', updatedUser));
    } catch (err) {
        console.log("更新用户失败", err);
        if (err.code === 11000) {
            return res.json(ResponseModel.error('更新失败,用户名已存在'));
        }
        return res.json(ResponseModel.error(err.message));
    }
});

/**
 * delete a user
 */
router.delete('/:id', async function (req, res, next) {
    const { id } = req.params;
    if(!id) return res.json(ResponseModel.error('请输入用户ID'));
    try {
        const data = await UserModel.deleteOne({_id: id}) // 注意mongodb的集合中_id字段有下划线
        if (data.deletedCount === 0) { // 注意检查deletedCount
            return res.json(ResponseModel.error('用户不存在'));
        }
        return res.json(ResponseModel.success('删除用户成功'));
    } catch (err) {
        console.log("删除用户失败", err);
        return res.json(ResponseModel.error(err.message));
    }
});

module.exports = router;

核心文件 app.js

const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const connectDB = require('./db/db');

const moviesRouter = require('./routes/movies');
const usersRouter = require('./routes/users');

const app = express();

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

connectDB()

app.use('/movies', moviesRouter);
app.use('/users', usersRouter);

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running: http://localhost:${PORT}`);
});

module.exports = app;

文件根目录下启动app.js

node app.js

使用 Node.js + Express + MongoDB 构建的简单的增删改查 Node.js 和 Express 构建的简单的增删改查,要在应用程序中持久化数据,你需要使用数据库。现代应用程序通常会选择关系型数据库(如 PostgreSQL, MySQL)或非关系型数据库(如 MongoDB, Redis)来存储数据。以下是使用数据库持久化数据的基本步骤,以及一个使用 Node.js 和 MongoDB 作为示例的简单说明。 阅读详情

相关推荐

Node.js全栈开发实战:Express+MongoDB构建应用

在Mongoose中,可以定义模型来映射数据库中的集合,并进行CRUD(创建、读取、更新、删除)操作。});// 创建用户age: 30});// 读取用户// 更新用户// 删除用户// 执行操作本文分享了Node.js全栈开发的实用技巧,特别是使用Express和MongoDB构建应用的实战经验。通过掌握这些知识点和技巧,读者可以更加高效地开发全栈Web应用,从后端API设计到前端用户界面集成,实现完整的业务逻辑。

shejizuopin的博客 1343

Node.js 连接 MongoDB

mongodb` 是 MongoDB 官方提供的 Node.js 驱动,能让你直接与 MongoDB 数据库交互。

weixin_64684095的博客 658

从零开始搭建书籍管理系统:Node.js + Express + MongoDB + React 技术栈全程实践

我们的目标是搭建一个简单的书籍管理系统,用户可以通过前端界面添加、编辑、删除书籍并查看书籍列表。:作为后端服务,提供RESTful API接口,处理前端请求,并与数据库进行交互。MongoDB:作为数据库存储系统,用于存储书籍信息。React:作为前端框架,提供动态交互界面,展示和操作书籍数据。本文介绍了如何使用技术栈,搭建一个简单的书籍管理系统。通过分步骤讲解了如何实现后端API、创建MongoDB模型、编写React组件等,并且完成了一个前后端完全分离的项目。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 934

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

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

小淼淼的博客 4815

前端Vue Node.js + Express + MongoDB 构建的后端服务API接口

构建一个使用 Vue.js 作为前端,Node.jsExpressMongoDB作为后端服务的全栈应用涉及到多个步骤。这里简要概述整个过程,并提供一些基本的代码示例来帮助你开始。

Min_nna的博客 1625

构建基于Node.js的CRUD应用程序

本文还有配套的精品资源,点击获取 简介:CRUD是数据库管理和Web应用程序中的基本操作。本项目展示了如何使用Node.js作为后端服务器环境,Express作为Web应用框架,以及MongoDB作为非关系型数据库来构建一个CRUD应用。开发者将学习到如何处理HTTP请求、定义数据模型、使用模板引擎动态生成页面,以及与数据库进行交互。 1. CRUD操作概念与应用...

weixin_35294091的博客 1825

mongoose中connect()、createConnection()和connection的区别和作用

1 mongoose简介 2 mongoose连接数据的方法 2.1 connection 2.2 connect() 2.3 createConnection() 3 总结

younglao的博客 1万+

Node.js + Express 实现数据库 CRUD 操作

Node.js是基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用JavaScript编写服务器端的代码。Node.js以其高效的I/O处理能力和非阻塞事件驱动模型,在Web开发领域迅速崛起,尤其适合处理大量并发请求的场景。Express 是一个灵活的 Node.js Web 应用开发框架,它提供了一系列强大的功能,用于开发单页、多页和混合 Web 应用程序。安装 Express 相当简单,首先需要确保你已经安装了 Node.js 和 npm。

weixin_34640289的博客 937

使用 Node、Express 和 MongoDB 构建一个项目工程

本文介绍了使用Node.js+Express+MongoDB构建RESTful API的全过程。主要内容包括:1) 项目初始化与Express服务器搭建,包括环境准备、依赖安装和项目结构;2) MongoDB数据库连接配置,涵盖安装、可视化工具使用和Node.js连接方法;3) 后端MVC架构设计;4) 身份验证实现,使用JWT生成token并进行服务端验证。文章提供了详细的代码示例和配置说明,从环境搭建到核心功能实现,为开发者构建安全可靠的Node.js后端服务提供了完整指导。

weixin_68397463的博客 1910

Node.js Express与MongoDB博客系统开发实战

本文还有配套的精品资源,点击获取 简介:本项目采用Node.js及其Express框架,结合MongoDB非关系型数据库,构建一个基于RESTful API的Web博客服务。通过CRUD操作实现文章的发布、阅读、编辑和删除功能。项目强调了Node.js的异步I/O和事件驱动特性,以及MongoDB处理大规模、复杂数据集的能力,适合进行毕业设计等综合性开发任务。 1...

weixin_42575505的博客 1882

基于Node.js+Express+MongoDB的个人博客系统实战记录

开发一套可运行的个人博客系统,涉及Web框架、数据库设计、数据建模、认证鉴权、查询优化及部署运维等完整技术链路。在环境配置阶段,开发者常被nodejs卸载重装更换版本等版本问题困扰,合理使用nvm-windows可高效管理多版本环境。基于Express与MongoDB,可实现从用户注册登录到文章管理的全栈能力,而利用MongoDB聚合函数,能轻松完成评论数统计、分类汇总等业务指标分析。面对数据增长,索引优化与游标分页是保障查询性能的关键手段。本文从实际工程角度,梳理了从环境搭建、数据库建模到上线部署的完整路

weixin_30634661的博客 416

推荐:基于Node.js-Express-MongoDB的CRUD应用

推荐:基于Node.js-Express-MongoDB的CRUD应用 在这个快速发展的Web开发时代,高效、灵活和可扩展的工具是每个开发者追求的目标。今天,我们向您推荐一个出色的开源项目——Node.js-Express-MongoDB-CRUD,这是一个全面的教程,将引导您通过创建一个完整的创建、读取、更新和删除(CRUD)应用来掌握Node.js、Express框架和MongoDB数据库的集...

gitblog_00040的博客 334

ESP32-P4实战:LVGL V9.4 PPA加速配置与性能对比

本文详细介绍了如何在ESP32-P4平台上配置LVGL V9.4的PPA硬件加速功能,通过启用PPA加速显著提升图形处理性能并降低CPU占用率。文章包含环境准备、配置步骤、性能对比及常见问题解决方案,帮助开发者高效利用ESP32-P4的PPA加速器优化嵌入式GUI应用。

rice5的博客 1191

node.js(express)+MongoDB快速搭建后端---新手教程

Node.js是一个基于 Chrome V8引擎的JavaScript运行环境,是对于前端工程师来说学习成本最小的后端实现方法,本篇文章总结如何从0-1写一个后端的登录接口。

wzy_PROTEIN的博客 4207

9 海康视觉平台VisionMaster 上手系列:典型案例之螺丝机案例

海康视觉平台VisionMaster 上手系列:典型案例之螺丝机案例 快速入门 工业机器视觉 机器视觉

HuangGong2022的博客 7180

airodump-ng、aircrack-ng使用教程

wifi破解、airodump-ng、aircrack-ng脚本

ssmbyss的博客 2233

MERN-CRUD用户手册:轻松掌握React界面的增删改查操作

想要快速上手MERN全栈开发吗?MERN-CRUD项目为您提供了一个完美的学习起点!这个基于MongoDB、Express.js、React.js和Node.js技术的完整CRUD系统,通过实时数据同步功能,让您轻松掌握现代Web应用开发的核心技能。无论您是前端新手还是全栈开发者,这篇终极指南将带您深入了解如何使用React界面进行高效的数据增删改查操作。 ## 🚀 什么是MERN-CRUD项

gitblog_00260的博客 750

Cadence仿真实战:从零构建高精度带隙基准电压源

本文是一份详细的Cadence仿真实战指南,指导读者从零开始构建高精度带隙基准电压源。文章首先解释了带隙基准电压源稳定输出电压的原理,然后逐步演示了在Cadence Virtuoso环境中如何搭建测试电路、测量关键温度系数、计算并搭建核心电路,并通过参数扫描和迭代调优来驯服温度漂移,最终实现低漂移的基准电压输出。

weixin_29207533的博客 243

探索数据管理的简明之道:Zell的CRUD、Express与MongoDB开源项目

探索数据管理的简明之道:Zell的CRUD、Express与MongoDB开源项目 项目介绍 在Web开发的世界里,CRUD(创建、读取、更新、删除)操作是最为核心的功能之一。今天,我们向大家推荐一个由Zell精心打造的开源项目——一个基于Express框架和MongoDB数据库的CRUD教程应用。通过这个项目,开发者可以快速上手如何在Node.js环境下搭建支持CRUD功能的应用程序。项目不仅...

gitblog_00564的博客 1105

Android11原生设置屏幕亮由Gamma变化改为线性变化

从Android9 开始屏幕亮度调解变成非线性变化,这样的话就会出现 之前亮度变化很小,到后面时变化亮度很快; 修改为线性变化,只需要修改 ./frameworks/base/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java /* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache L

Android 4926

【实战项目开发技术分享】如何设置机器人禁行区/虚拟墙

在现代机器人技术的日益发展中,路径规划是使机器人在复杂环境中安全、高效移动的关键部分。其中一个重要的问题是如何划定机器人的禁行区,以确保机器人不会进入危险区域或无法到达的地方。在本文中,我们将探讨一些关键策略,帮助机器人算法工程师更好地划定禁行区。代价地图可以通过多层叠加来实现,一般包括以下几个层级:静态地图层(Static Map Layer):由SLAM(Simultaneous Localization and Mapping)构建的静态地图。该层包含了环境中固定不变的地物信息,如墙壁、家具等。

xiewf的博客 1万+

使用Node,Express和MongoDB编写RESTful服务

考虑到Node.js的流行,我想到了学习和创建一个REST API,该API应该创建,删除数据库并从数据库中获取雇员,所幸我做到了。 在这篇文章中,我将尝试复制与参考一起编写时所遵循的步骤。 假设我们的系统中已经安装了Node.js,让我们开始按照以下步骤创建nodejs-rest-api : 第1步:创建一个目录,其中将包含与我们的应用程序相关的所有文件,对我来说,它是/ Us...

danpu0978的博客 265

【WRF-Chem工具】pyVPRM 计算大气与陆地植被之间的 CO₂ 交换通量

pyVPRM 计算大气与陆地植被之间的 CO₂ 交换通量

WW、forever的博客 210

MERN-CRUD完全指南:构建实时MongoDB+React全栈应用的终极教程

想要快速掌握全栈开发技能吗?MERN-CRUD项目是您学习现代Web开发的完美起点!这个完整的MERN全栈应用展示了如何使用MongoDB、Express.js、React.js和Node.js构建具有实时CRUD操作的系统,是初学者和专业开发者都能从中受益的实战教程。 ## 🚀 项目概述与核心价值 MERN-CRUD是一个完整的全栈应用示例,它演示了如何使用流行的MERN技术栈(Mongo

gitblog_00089的博客 1094

如何在 Linux 上安装 RTX 5090 / 5080 /5070 Ti / 5070 驱动程序 — 详细指南

Linux 上的 NVIDIA 5090 是 AI、游戏和渲染的强大引擎,但需要耐心。如果稳定性是首要考虑因素,请坚持使用开源驱动程序,并关注 NVIDIA 论坛以获取未来更新。

iCloudEnd的博客 6915

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

使用Express和MongoDB构建Node.js应用的高效框架:Express-MongoDB-Node

使用Express和MongoDB构建Node.js应用的高效框架:Express-MongoDB-Node 在这个快速发展的Web开发领域中,是一个值得你关注的开源项目。该项目结合了流行的Express.js框架、强大的MongoDB数据库和Node.js运行环境,为开发者提供了一个简洁而高效的工具集,用于构建高性能的RESTful API和服务端应用程序。 项目简介 Express-Mongo...

gitblog_00023的博客 450

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: React 配置跨域
下一篇: 前端工作者vscode常用的插件
前端开发洋洋
博客等级 码龄3年 77粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值