二、mongoose的使用,实现用户集合的操作

前言

        mongodb:为了在node应用中与MongoDB交互,开发者需要使用MongoDB的驱动程序,所以安装的mongodb就是其驱动程序;

        mongoose: 是一个用于 MongoDB 的对象建模工具,提供了一个丰富的查询语言和许多其他功能,以帮助开发者更方便地使用 MongoDB,可以理解为MongoDB插件/工具。

        一般来说,对于大多数 MongoDB 的操作,使用 mongoose 已经足够了

服务端工程目录示例:
--server		// 根目录
	--model
  	--main.js // 数据对象模型model
	--routes
  	--user.js	//	路由(接口)文件
	--db.js			//	连接 MongoDB 数据库
	--server.js	// 	入口文件,连接数据库,启动服务,挂载路由

如何在中创建一个用户“表”(集合),并且实现添加和查询

        在MongoDB中,术语“表”对应的是集合(Collection)。创建一个集合并不需要显式操作,因为当你向一个不存在的集合中插入文档时,MongoDB会自动创建这个集合。

1.连接服务器

const mongoose = require('mongoose');

// 连接数据库函数
async function connect() {
  try {
    await mongoose.connect('mongodb://127.0.0.1:27017/mydatabase', {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });
    console.log('Connected to MongoDB');
  } catch (error) {
    console.error('Error connecting to MongoDB:', error);
    throw error; // 抛出错误以便在调用处被捕获
  }
}

module.exports = { connect };

2.创建一个Mongoose Schema对象

const mongoose = require("mongoose");

// 用户Schema
const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  email: { type: String, unique: true, required: true },
  password: { type: String, required: true },
});

// 创建User Model
const User = mongoose.model("User", userSchema);

module.exports = { User };

上面的代码:创建一个Mongoose Schema对象,它是对MongoDB集合中存储的文档结构的一种描述或模式定义。参数传入一个对象来定义文档的结构。

在这个例子中:

  • name、email 和 password 是我们定义的字段(或键),它们代表了文档可能具有的属性。
  • 对于每个字段,我们指定了其类型,如 String、Number、Date 等。这里 name 和 password 都被指定为 String 类型。
  • 对于 email 字段,我们不仅指定了类型为 String,还添加了一个选项 unique: true,这意味着MongoDB会确保该集合中的所有文档的 email 字段值都是唯一的,即不会有重复的电子邮件地址。

        通过定义这样一个Schema,Mongoose会在插入、更新文档时自动进行数据类型检查和约束验证,以保证数据库中数据的一致性和完整性。后续通过 mongoose.model('User', userSchema) 可以基于此Schema创建Model,进而执行查询、插入、更新和删除等数据库操作。

3.user相关接口编写

// usersRoutes.js
const express = require("express");
const { User } = require("../model/main"); // 确保路径正确指向db.js文件

const router = express.Router();

// 用户保存接口
router.post("/", async (req, res) => {
  try {
    const newUser = new User(req.body);
    await newUser.save();
    res.status(201).json({ message: "User created!", user: newUser });
  } catch (error) {
    console.error("Error creating user:", error);
    res
      .status(500)
      .json({ error: "An error occurred while creating the user." });
  }
});

// 查询单个用户或所有用户接口
router.get("/:id?", async (req, res) => {
  try {
    if (req.params.id) {
      const userId = req.params.id;
      const user = await User.findById(userId);
      if (!user) {
        return res.status(404).json({ message: "User not found." });
      }
      res.json(user);
    } else {
      const users = await User.find();
      res.json(users);
    }
  } catch (error) {
    console.error("Error fetching user(s):", error);
    res
      .status(500)
      .json({ error: "An error occurred while fetching the user(s)." });
  }
});

module.exports = router;

4.编写服务启动文件, 并挂在用户路由

// server.js
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const { connect } = require('./db'); // 确保路径正确指向db.js文件

const app = express();
app.use(cors());
app.use(bodyParser.json());

// 在服务器启动前先连接数据库
async function startServer() {
  try {
    await connect();
    console.log('Connected to MongoDB');

    // 挂载用户路由到 /api/users
    const usersRoutes = require('./routes/user');
    app.use('/api/users', usersRoutes);

    // 启动服务器
    const PORT = process.env.PORT || 3000;
    app.listen(PORT, () => {
      console.log(`Server is running on port ${PORT}`);
    });
  } catch (error) {
    console.error('Error connecting to MongoDB:', error);
  }
}

startServer();

5.启动服务,在前端工程中调用接口,获取到用户数据

在服务端工程的终端下:启动服务:node server.js

前端工程调用查询:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陨石猎人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值