使用 Express.js 和 MongoDB 进行 CRUD 操作

本指南介绍如何使用 Express.js 和 MongoDB 实现 CRUD(创建、读取、更新、删除)操作。CRUD 是与数据库交互的基本概念,对于大多数 Web 应用程序来说都是必不可少的。

先决条件

  • JavaScript、Node.js 和 Express.js 的基本知识。
  • MongoDB 安装在本地或访问 MongoDB 云服务(例如 MongoDB Atlas)。
  • npm 已安装。
  • 项目设置

  • 初始化 Node.js 项目:
  • mkdir crud-express-mongodb
       cd crud-express-mongodb
       npm init -y
  • 安装依赖项:
  • npm install express mongoose body-parser cors dotenv
  • 创建以下文件夹结构:
  • crud-express-mongodb/
       |-- models/
       |-- routes/
       |-- .env
       |-- server.js

    步骤 1:设置 MongoDB 连接

    文件:.env

    MONGO_URI=mongodb://localhost:27017/crudDB
    PORT=5000

    文件:server.js

    const express = require("express");
    const mongoose = require("mongoose");
    const bodyParser = require("body-parser");
    const cors = require("cors");
    require("dotenv").config();
    
    const app = express();
    
    // Middleware
    app.use(bodyParser.json());
    app.use(cors());
    
    // MongoDB Connection
    mongoose
      .connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true })
      .then(() => console.log("MongoDB Connected"))
      .catch((err) => console.error("MongoDB connection error:", err));
    
    // Routes
    const itemRoutes = require("./routes/itemRoutes");
    app.use("/api/items", itemRoutes);
    
    // Start Server
    const PORT = process.env.PORT || 5000;
    app.listen(PORT, () => console.log(`Server running on port ${PORT}`));

    第 2 步:创建 MongoDB 模式

    文件:models/Item.js

    const mongoose = require("mongoose");
    
    const itemSchema = new mongoose.Schema({
      name: {
        type: String,
        required: true,
      },
      description: {
        type: String,
        required: true,
      },
      price: {
        type: Number,
        required: true,
      },
    }, { timestamps: true });
    
    module.exports = mongoose.model("Item", itemSchema);

    步骤 3:实现 CRUD 路由

    文件: routes/itemRoutes.js

    const express = require("express");
    const router = express.Router();
    const Item = require("../models/Item");
    
    // Create an item
    router.post("/", async (req, res) => {
      try {
        const newItem = new Item(req.body);
        const savedItem = await newItem.save();
        res.status(201).json(savedItem);
      } catch (err) {
        res.status(500).json({ error: err.message });
      }
    });
    
    // Get all items
    router.get("/", async (req, res) => {
      try {
        const items = await Item.find();
        res.status(200).json(items);
      } catch (err) {
        res.status(500).json({ error: err.message });
      }
    });
    
    // Get an item by ID
    router.get("/:id", async (req, res) => {
      try {
        const item = await Item.findById(req.params.id);
        if (!item) return res.status(404).json({ error: "Item not found" });
        res.status(200).json(item);
      } catch (err) {
        res.status(500).json({ error: err.message });
      }
    });
    
    // Update an item by ID
    router.put("/:id", async (req, res) => {
      try {
        const updatedItem = await Item.findByIdAndUpdate(req.params.id, req.body, { new: true });
        if (!updatedItem) return res.status(404).json({ error: "Item not found" });
        res.status(200).json(updatedItem);
      } catch (err) {
        res.status(500).json({ error: err.message });
      }
    });
    
    // Delete an item by ID
    router.delete("/:id", async (req, res) => {
      try {
        const deletedItem = await Item.findByIdAndDelete(req.params.id);
        if (!deletedItem) return res.status(404).json({ error: "Item not found" });
        res.status(200).json({ message: "Item deleted" });
      } catch (err) {
        res.status(500).json({ error: err.message });
      }
    });
    
    module.exports = router;

    步骤 4:测试 API

    使用 Postman 或 cURL 等工具测试以下端点:

  • 创建项目:
  • POST /api/items
       Content-Type: application/json
       {
         "name": "Laptop",
         "description": "A powerful laptop",
         "price": 1200
       }
  • 获取所有物品:
  • GET /api/items
  • 通过 ID 获取项目:
  • GET /api/items/:id
  • 更新项目:
  • PUT /api/items/:id
       Content-Type: application/json
       {
         "name": "Gaming Laptop",
         "description": "A high-end gaming laptop",
         "price": 1500
       }
  • 删除项目:
  • DELETE /api/items/:id