node.js基础学习-mongoose操作MongoDB(十二)

一、前言

在 Node.js 应用中,路由用于处理不同的 URL 路径请求,决定应该执行什么操作;而 Mongoose 用于与 MongoDB 数据库进行交互,如进行数据的存储、查询、更新和删除。它们结合使用可以构建功能强大的 Web 应用,实现根据不同的请求对数据库进行相应的操作。

二、以 Express 框架为例说明结合方式

1. 项目设置与基础依赖安装

首先创建一个 Node.js 项目,npm init生成package.json,在项目目录下通过npm install express mongoose安装 Express 和 Mongoose。假设还使用body - parser中间件来处理请求体数据(在 Express 4.16 + 版本中,express.urlencodedexpress.json中间件已经内置,可以代替body - parser部分功能)。

2. 连接数据库(使用 Mongoose)

在项目的入口文件(如app.js)中,引入 Mongoose 并连接到数据库。

js 复制代码
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/your_database_name', {
  useNewUrlParser: true,
  useUnifiedTopology: true
});
const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
  console.log("Connected to MongoDB successfully");
});

这里your_database_name是要连接的数据库名称,连接选项useNewUrlParseruseUnifiedTopology是为了避免一些连接警告和问题。

3. 定义数据模型(使用 Mongoose)

在单独的文件(如models/user.js)中定义数据模型。例如,定义一个用户模型:

js 复制代码
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  age: {
    type: Number,
    default: 0
  },
  email: {
    type: String,
    unique: true,
    match: /^\S+@\S+\.\S+$/
  }
});
const User = mongoose.model('User', userSchema);
module.exports = User;

4. 创建路由(使用 Express)并结合 Mongoose 操作

app.js或者专门的路由文件(如routes/userRoutes.js)中创建路由,并在路由处理函数中使用 Mongoose 模型进行数据库操作。

查询操作示例

js 复制代码
const express = require('express');
const router = express.Router();
const User = require('../models/user');
// 查询所有用户的路由
router.get('/users', async (req, res) => {
  try {
    const users = await User.find();
    res.send(users);
  } catch (e) {
    console.error(e);
    res.status(500).send({ error: 'Internal Server Error' });
  }
});
module.exports = router;

这里定义了一个GET /users路由,当客户端发送请求到这个路径时,会调用async函数。在函数内部,使用User.find()方法(User是之前定义的 Mongoose 模型)查询所有用户数据。如果查询成功,将用户数据发送回客户端;如果出现错误,返回500错误状态码和错误信息。

插入操作示例

js 复制代码
// 插入新用户的路由
router.post('/users', async (req, res) => {
  try {
    const newUser = new User(req.body);
    await newUser.save();
    res.send(newUser);
  } catch (e) {
    console.error(e);
    res.status(400).send({ error: 'Bad Request' });
  }
});

对于POST /users路由,当客户端发送数据到这个路径时,会创建一个新的User对象(使用req.body中的数据),然后将其保存到数据库中。如果保存成功,将新用户数据发送回客户端;如果出现错误(如数据验证不通过),返回400错误状态码和错误信息。

更新操作示例

js 复制代码
// 更新用户信息的路由
router.put('/users/:id', async (req, res) => {
  try {
    const { id } = req.params;
    const updatedUser = await User.findByIdAndUpdate(id, req.body, {
      new: true
    });
    if (!updatedUser) {
      res.status(404).send({ error: 'User not found' });
    } else {
      res.send(updatedUser);
    }
  } catch (e) {
    console.error(e);
    res.status(500).send({ error: 'Internal Server Error' });
  }
});

PUT /users/:id路由中,:id是路由参数,表示要更新的用户的唯一标识符。通过req.params获取id,然后使用User.findByIdAndUpdate方法根据id找到用户并更新其信息(req.body包含更新的数据)。如果new: true选项被设置,会返回更新后的用户对象。如果找不到用户,返回404错误状态码和错误信息;如果出现其他错误,返回500错误状态码和错误信息。

删除操作示例

js 复制代码
// 删除用户的路由
router.delete('/users/:id', async (req, res) => {
  try {
    const { id } = req.params;
    const deletedUser = await User.findByIdAndDelete(id);
    if (!deletedUser) {
      res.status(404).send({ error: 'User not found' });
    } else {
      res.send({ message: 'User deleted successfully' });
    }
  } catch (e) {
    console.error(e);
    res.status(500).send({ error: 'Internal Server Error' });
  }
});

DELETE /users/:id路由中,同样通过req.params获取id,然后使用User.findByIdAndDelete方法根据id删除用户。如果找不到用户,返回404错误状态码和错误信息;如果删除成功,返回成功消息;如果出现其他错误,返回500错误状态码和错误信息。

相关推荐
加德霍克4 分钟前
Opencv之识别图片颜色并绘制轮廓
图像处理·人工智能·opencv·学习·计算机视觉
MongoDB 数据平台12 分钟前
印闪网络:阿里云数据库MongoDB版助力金融科技出海企业降本增效
数据库·mongodb·阿里云
技术路上的苦行僧14 分钟前
分布式专题(4)之MongoDB快速实战与基本原理
数据库·分布式·mongodb
studying_mmr14 分钟前
MongoDB
数据库·mongodb
LuckyLay15 分钟前
Rust学习笔记_17——HashMap
笔记·学习·rust
MongoDB 数据平台17 分钟前
Alan Chhabra:MongoDB AI应用程序计划(MAAP) 为客户提供价值
数据库·人工智能·mongodb
梦境虽美,却不长44 分钟前
C语言学习日志 结构体 2024/12/12
学习
IT古董1 小时前
【机器学习】机器学习的基本分类-无监督学习-t-SNE(t-分布随机邻域嵌入)
人工智能·学习·机器学习·分类
逆光的July1 小时前
arthas学习笔记
笔记·学习
hacker7071 小时前
Datawhale AI冬令营学习笔记--定制你的专属大模型
人工智能·笔记·学习