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

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.dtcms.com/a/347756.html

相关文章:

  • 基于深度学习的中草药识别系统:从零到部署的完整实践
  • CA6150主轴箱系统设计cad+设计说明书
  • Java 学习笔记(基础篇8)
  • MQTT 核心概念与协议演进全景解读(二)
  • BEVDepth
  • 9.Shell脚本修炼手册---数值计算实践
  • python re模块常用方法
  • 取件码-快递取件助手, 短信自动识别ios app Tech Support
  • Access开发打造专业的开关按钮效果
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(七) 鼠标在控件上悬浮时的提示
  • Meta押注Midjourney:一场关于生成式AI的加速赛
  • 【读代码】SQLBot:开源自然语言转SQL智能助手原理与实践
  • GUAVA 实现限流
  • GEO优化服务商赋能全球数字经济发展 技术创新引领行业新格局
  • Java—— 动态代理
  • 基于Python与Tkinter的校园点餐系统设计与实现
  • Spring Data Redis基础
  • [Vid-LLM] docs | 视频理解任务
  • Windows应急响应一般思路(三)
  • 第1.2节:早期AI发展(1950-1980)
  • 老字号:用 “老根” 熬活的 “新味道”
  • redis---string类型详解
  • 大模型四种常见安全问题与攻击案例
  • mysql的mvcc
  • 大语言模型应用开发——利用OpenAI函数与LangChain结合从文本构建知识图谱搭建RAG应用全流程
  • Redis全面详解:从配置入门到实战应用
  • 【前端debug调试】
  • 【Java SE】抽象类、接口与Object类
  • 从“一指禅”到盲打:如何系统提升电脑输入能力?
  • 25.深入对象