当前位置: 首页 > ai >正文

nodejs 集成mongodb实现增删改查

初始化项目:
npm init -y
npm install mongoose -save 安装mongoose 插件
mongoose 链接数据库语法:
mongodb://[username:password@]host1[:poert1],host2[:port2]…/[databsase]?[options…]

userame: 用户名
passwrod: 密码
host1:port1,host2:port2… 链接地址,mongodb 支持分布式高可用集群模式,可以有多个地址
database : 数据库名称
?options: 可以选择的get形式的的连接选项。例如poolSize=10&replicatSet=student

options 的可选内容如下:
useNewUrlParse 布尔值使用新版本的url解析器来解析链接字符串
reconnectTries 数值型 ,重连次数
reconnectInterval 数值型 重连间隔 单位是毫米
poolSize 数值 连接池大小

本地链接mongodb 示例:

const mongoose = require(‘mongoose’);
async function connect() {
try {
await mongoose.connect(‘mongodb://localhost:27017/student’,{
useNewUrlParser: true
});
console.log(‘数据库链接成功’);
} catch (error) {
console.log(‘数据库链接失败’+error);
}
}
connect();

(node:7252) [MONGODB DRIVER] Warning: useNewUrlParser is a deprecated option: useNewUrlParser has no effect since Node.js Driver version 4.0.0 and will be removed in the next major version
(Use node --trace-warnings ... to show where the warning was created)
数据库链接成功

mongoose 的相关概念:
Schema 模型的骨架,可以用来生成模型类,通过模型类可以生成文档
Model 由Schema 产生的构造器,具有属性和行为,,model的每一个实例就是一个Mongodb的document
Instance model的实例,通过new Model()得到

Schema 的语法:
const schema = new Schema({字段名:字段类型});
const schema = new Schema({字段名:选项});

字段类型如下:
String Boolean Number Date Object Array
选项是高度自定义的方式,可以定义字段必填,默认值等属性
,支持的属性如下:
type 数据类型
default 默认值
index 索引选项
backgroup 是否后台创建
unique 是否唯一索引
required 是否必填
unique 是否唯一索引
min 最小值
max 最大值

Schema 实例

const Post = new Schema({
title: { type: String, required: true, unique: true },
content: { type: String, required: true },
createTime: { type: Date, default: new Date(), index: { background: false, unique: true } },
tags: [String], //数组
published: Boolean,
meta: {
praise: Number,
comments: Number
}
});

定义实例方法:语法如下
schema.methods.方法名 = function(参数){
//业务代码
}

在上面的Post 实例代码中添加 实例方法

const mongoose = require(‘mongoose’);
async function connect() {
try {
await mongoose.connect(‘mongodb://localhost:27017/student’,{
useNewUrlParser: true
});
console.log(‘数据库链接成功’);
} catch (error) {
console.log(‘数据库链接失败’+error);
}
}

connect();

const Post = new Schema({
title: { type: String, required: true, unique: true },
content: { type: String, required: true },
createTime: { type: Date, default: new Date(), index: { background: false, unique: true } },
tags: [String], //数组
published: Boolean,
meta: {
praise: Number,
comments: Number
}
});

//定义实例方法
Post.methods.getPraise = function(){
return this.meta.praise;
}

const Model = mongoose.model(‘Post’,Post);
const news = new Model();
news.meta = {praise: 0 ,comments:1};

console.log(news.getPraise());

==================================================
nodejs + mongodb + Schema + model 实现怎删改查

npm init -y
npm install express mongoose dotenv
npm install -D nodemon 热部署插件

添加目录结构:
在这里插入图片描述
models/User.js 定义实例对象和方法 类似于java 里面一个普通的pojo

const mongoose = require(‘mongoose’);

const userSchema = new mongoose.Schema({
name: {
type: String,
required: true,
trim: true
},
email: {
type: String,
required: true,
unique: true,
lowercase: true
},
age: {
type: Number,
min: 0
},
isActive: {
type: Boolean,
default: true
},
createdAt: {
type: Date,
default: Date.now
}
});

// 可添加实例方法
userSchema.methods.getUserInfo = function() {
return Name: ${this.name}, Email: ${this.email}, Active: ${this.isActive};
};

// 可添加静态方法
userSchema.statics.findActiveUsers = function() {
return this.find({ isActive: true });
};

// 可添加查询助手
userSchema.query.byName = function(name) {
return this.where({ name: new RegExp(name, ‘i’) });
};

module.exports = mongoose.model(‘User’, userSchema);

routes/users.js 定义路由方法

const express = require(‘express’);
const router = express.Router();
const User = require(‘…/models/User’);

// CREATE - 创建新用户
router.post(‘/’, async (req, res) => {
try {
const user = new User(req.body);
const savedUser = await user.save();
res.status(201).json({
success: true,
data: savedUser,
message: ‘User created successfully’
});
} catch (error) {
if (error.name === ‘ValidationError’) {
const errors = Object.values(error.errors).map(err => err.message);
return res.status(400).json({
success: false,
message: ‘Validation error’,
errors
});
}
res.status(500).json({
success: false,
message: ‘Server error’,
error: error.message
});
}
});

// READ - 获取所有用户
router.get(‘/’, async (req, res) => {
try {
const { name, active } = req.query;
let query = User.find();
// 查询条件示例
if (name) {
query = query.byName(name);
}
if (active !== undefined) {
query = query.where(‘isActive’).equals(active === ‘true’);
}

const users = await query.sort({ createdAt: -1 });
res.json({success: true,count: users.length,data: users
});

} catch (error) {
res.status(500).json({
success: false,
message: ‘Server error’,
error: error.message
});
}
});

// READ - 根据ID获取单个用户
router.get(‘/:id’, async (req, res) => {
try {
const user = await User.findById(req.params.id);
if (!user) {
return res.status(404).json({
success: false,
message: ‘User not found’
});
}
res.json({
success: true,
data: user
});
} catch (error) {
if (error.name === ‘CastError’) {
return res.status(400).json({
success: false,
message: ‘Invalid user ID’
});
}
res.status(500).json({
success: false,
message: ‘Server error’,
error: error.message
});
}
});

// UPDATE - 更新用户
router.put(‘/:id’, async (req, res) => {
try {
const user = await User.findByIdAndUpdate(
req.params.id,
req.body,
{
new: true, // 返回更新后的文档
runValidators: true // 运行验证
}
);

if (!user) {return res.status(404).json({success: false,message: 'User not found'});
}res.json({success: true,data: user,message: 'User updated successfully'
});

} catch (error) {
if (error.name === ‘ValidationError’) {
const errors = Object.values(error.errors).map(err => err.message);
return res.status(400).json({
success: false,
message: ‘Validation error’,
errors
});
}
res.status(500).json({
success: false,
message: ‘Server error’,
error: error.message
});
}
});

// DELETE - 删除用户
router.delete(‘/:id’, async (req, res) => {
try {
const user = await User.findByIdAndDelete(req.params.id);
if (!user) {
return res.status(404).json({
success: false,
message: ‘User not found’
});
}
res.json({
success: true,
message: ‘User deleted successfully’
});
} catch (error) {
if (error.name === ‘CastError’) {
return res.status(400).json({
success: false,
message: ‘Invalid user ID’
});
}
res.status(500).json({
success: false,
message: ‘Server error’,
error: error.message
});
}
});

module.exports = router;

.env 文件保存服务中所需要的配置项
创建一个.env 文件 加入如下内容

MONGODB_URI=mongodb://localhost:27017/student
PORT=3000

app.js 定义服务入口,包括组件引入,路由挂载,配置加载和服务启动等功能

const express = require(‘express’);
const mongoose = require(‘mongoose’);
const path = require(‘path’);
require(‘dotenv’).config();

//const userRoutes = require(‘./routes/users’);
// 正确导入路由 - 使用绝对路径
const userRoutes = require(path.join(__dirname, ‘routes’, ‘users’));

const app = express();
const PORT = process.env.PORT || 3000;

// 中间件
app.use(express.json());

// 连接 MongoDB
mongoose.connect(process.env.MONGODB_URI || ‘mongodb://localhost:27017/student’, {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => console.log(‘Connected to MongoDB’))
.catch(err => console.error(‘Could not connect to MongoDB:’, err));

// 路由
app.use(‘/api/users’, userRoutes);

// 启动服务器
app.listen(PORT, () => {
console.log(Server is running on port ${PORT});
});

遇到的问题:
https://dotenvx.com/radar
c:\Users\Lei.Wang170\Desktop\project\node_modules\router\index.js:151
throw new TypeError(‘argument callback is required’)
解决步骤:

1. 卸载有问题的包

npm uninstall router

2. 清理 node_modules(如果问题持续)

rm -rf node_modules package-lock.json

3. 清理 npm 缓存

npm cache clean --force

4. 重新安装正确依赖

npm install express mongoose dotenv

5. 安装开发依赖

npm install --save-dev nodemon

还有需要在package.json 中添加
“scripts”: {
“start”: “node app.js”,
“dev”: “nodemon app.js”,
“test”: “echo “Error: no test specified” && exit 1”
}

6. 启动开发服务器

npm run dev
在这里插入图片描述

测试结果:
在这里插入图片描述
查询接口返回数据
在这里插入图片描述
命令行查看结果:
在这里插入图片描述
视图工具查看结果:
在这里插入图片描述

其他Api 的用法:
官网路径:
mongoose:
https://www.mongodb.com/zh-cn/docs/drivers/node/current/integrations/mongoose-get-started/

nodejs
https://nodejs.p2hp.com/api/v19/documentation/

http://www.xdnf.cn/news/18505.html

相关文章:

  • Kubernetes相关问题集(四)
  • 什么是正态分布
  • B.30.01.1-Java并发编程及电商场景应用
  • Socket 编程预备
  • 软件测试从入门到精通:通用知识点+APP专项实战
  • 使用Screenpipe+本地大模型实现私人助手Agent
  • 某电器5G智慧工厂网络建设全解析
  • Linux学习:信号的保存
  • TypeReference 泛型的使用场景及具体使用流程
  • GEO优化服务商:AI时代数字经济的新引擎——解码行业发展与技术创新实践
  • 【Spring Boot】集成Redis超详细指南 Redis在Spring Boot中的应用场景
  • kubernetes-dashboard使用http不登录
  • 【卷积神经网络详解与实例】1——计算机中的图像原理
  • 卓伊凡的开源战略与PHP-SG16加密技术深度解析-sg加密技术详解-卓伊凡
  • pixijs基础学习
  • pyecharts可视化图表-map:从入门到精通
  • 【手撕JAVA多线程:2.线程安全】 2.1.JVM层面的线程安全保证
  • C++算法·进制转换
  • DeepSeek V3.1深度解析:一个模型两种思维,迈向Agent时代的第一步!
  • 并查集详解
  • 基于Python的农作物病虫害防治网站 Python+Django+Vue.js
  • 说说你对Integer缓存的理解?
  • 文献阅读笔记【物理信息机器学习】:Physics-informed machine learning
  • 【秋招笔试】2025.08.23美团研发岗秋招笔试题
  • SpringBoot applicationContext.getBeansOfType获取某一接口所有实现类,应用于策略模式
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第五章整理
  • 墨刀原型设计工具操作使用指南及实践操作
  • 玩转Vue3高级特性:Teleport、Suspense与自定义渲染
  • 【假设微调1B模型,一个模型参数是16bit,计算需要多少显存?】
  • 【ABAP4】创建Package