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/

相关推荐
haogexiaole3 小时前
Redis优缺点
数据库·redis·缓存
在未来等你3 小时前
Redis面试精讲 Day 27:Redis 7.0/8.0新特性深度解析
数据库·redis·缓存·面试
新法国菜4 小时前
MySql知识梳理之DML语句
数据库·mysql
老华带你飞4 小时前
校园交友|基于SprinBoot+vue的校园交友网站(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·校园交友网站
许泽宇的技术分享4 小时前
Text2API与Text2SQL深度对比:自然语言驱动的数据交互革命
数据库·windows·microsoft
两张不够花8 小时前
Shell脚本源码安装Redis、MySQL、Mongodb、PostgreSQL(无报错版)
linux·数据库·redis·mysql·mongodb·postgresql·云计算
少陵野小Tommy8 小时前
Python能用古诗词数据库做什么7:根据标题、诗句查找诗歌
开发语言·数据库·python
khystal10 小时前
HUMS 2023齿轮箱数据分析
数据库·数据分析·信号处理
Warren9810 小时前
Spring Boot 整合网易163邮箱发送邮件实现找回密码功能
数据库·vue.js·spring boot·redis·后端·python·spring