二、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/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

前端工程调用查询:

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux:共享内存

文章目录 System V共享内存的原理管理共享内存shmgetshmatshmdtshmctl 共享内存和管道实现进程间同步通信 前面介绍完了匿名管道和命名管道,那么本篇要引入的主题是共享内存 System V 作为进程通信部分的内容,共享内存必然有其存在的意义和价值&#x…

计算机网络——网络层(2)

计算机网络——网络层(2) 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 网络层——控制平面概述路由选择转发表路由协议路由信息的交换小结 路由选择算法常见的路由选择算法距离矢量路由算法工作原理优缺点分析 链路状态路由算法基本工作原理优…

day11_oop

今日内容 零、 复习昨日 一、作业 二、封装 三、继承 四、重写 五、this和super 六、访问修饰符 零、 复习昨日 数组创建的两种方式 new int[3];new int[]{1,2,3,4}; 手写一个遍历输出数组元素的伪代码 构造方法什么作用? 创建对象,将对象的属性初始化 有参无参构造什么区别?…

【IEEE会议征稿通知】2024年算法、软件工程与网络安全国际学术会议(ASENS 2024)

2024年算法、软件工程与网络安全国际学术会议(ASENS 2024) The International Conference on Algorithms, Software Engineering and Network Security 2024年算法、软件工程与网络安全国际学术会议(ASENS 2024)将于2024年3月29…

error: failed to open index: Database already open. Cannot acquire lock报错解决办法

ordinals节点数据同步出现报错 error: failed to open index: Database already open. Cannot acquire lock.问题分析: 出现问题的原因是btcoin core节点数据没有同步完我们就开始进行ordinals数据同步,导致/root/.local/share/ord/index.redb 文件数据…

深度强化学习(王树森)笔记03

深度强化学习(DRL) 本文是学习笔记,如有侵权,请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接:https://github.com/wangshusen/DRL 源代码链接:https://github.c…

在Visual Studio 2022中将源文件扩展名改为 .c 后,没有显示 #define _CRT_SECURE_NO_WARNINGS 1?

一、问题 在Visual Studio 2022中将源文件扩展名改为 .c 后,没有显示 #define _CRT_SECURE_NO_WARNINGS 1? 二、解答 对于使用了不安全的C运行时库函数(如strcpy、scanf等)而触发的安全警告,编译器不会默认包含_CRT_S…

ubuntu中的rsyslog

目录 1. rsyslog简介 2. 查看/var/log 3. syslog的配置文件 3.1 /etc/rsyslog.d/50-default.conf 3.2 /etc/rsyslog.conf 4. 如何写入syslog 4.1 C语言 4.2 shell 4.3 内核输出 5. syslog.1和syslog.2.gz等文件是如何生成 6. logrotate是如何被执行 7. 如何限制sys…

OJ_糖果分享游戏

题干 c实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> using namespace std;void ShareCandy(vector<int>& student) {int size student.size();vector<int> share(size); //保存每个同学交换前&#xff0c;糖果数量…

HTTPS 之fiddler抓包--jmeter请求

一、浅谈HTTPS 我们都知道HTTP并非是安全传输&#xff0c;在HTTPS基础上使用SSL协议进行加密构成的HTTPS协议是相对安全的。目前越来越多的企业选择使用HTTPS协议与用户进行通信&#xff0c;如百度、谷歌等。HTTPS在传输数据之前需要客户端&#xff08;浏览器&#xff09;与服…

在centos 7 中安装配置Jdk、Tomcat、及Tomcat自启动

目录 一、安装配置Jdk 1.创建目录并上传文件 2.解压JDK压缩包 3.配置JDK环境变量 4.设置环境变量生效 二、安装配置Tomcat 1.上传Tomcat并解压 2.启停Tomcat 3.修改tomcat-user.xml配置 4.配置远程访问Tomcat 5.远程项目发布 三.Tomcat自启动配置 1.配置Tomcat自启…

腾讯多模态大模型最新综述,从26个主流大模型看多模态效果提升关键方法

在大规模语言模型&#xff08;LLMs&#xff09;通往通用人工智能&#xff08;AGI&#xff09;的道路中&#xff0c;从传统的单一的“语言模态”扩展到“图像”、“语音”等等的“多模态”必然是大模型进化的必经之路。 在过去的 2023 年&#xff0c;多模态大规模语言模型&…