前言
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/usersconst 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
前端工程调用查询: