第二节:使用Mongoose连接数据库

Mongoose 数据库介绍及安装指南

一、Mongoose 简介

Mongoose 是一个基于 Node.js 的 MongoDB 对象模型工具,它提供了一种更直观的方式来操作 MongoDB 数据库。通过 Mongoose,开发者可以使用面向对象的方式定义数据模型、进行数据验证和建立数据关联。

MongoDB 是一个基于分布式文件存储的 NoSQL 数据库,以其高性能、高可用性和易扩展性而著称。官方地址:www.mongodb.com/

二、MongoDB 安装与配置

下载安装

  1. 获取安装包

    访问官方下载地址:www.mongodb.com/try/downloa...

    建议选择 zip 格式,通用性更强

  2. 安装步骤

    • 将压缩包解压到 C:\Program Files 目录
    • 创建数据存储目录:C:\data\db(MongoDB 默认使用此路径存储数据)
    • 进入 MongoDB 的 bin 目录,打开命令行工具
    • 运行命令启动服务:mongod
  3. 验证启动 当命令行显示 waiting for connections 时,表示 MongoDB 服务已成功启动

  1. 连接数据库 在新命令行窗口中运行 mongo 命令即可连接本地 MongoDB 服务

使用建议

  • 环境变量配置 :将 MongoDB 的 bin 目录添加到系统环境变量 Path 中,方便全局使用 mongod 命令
  • 操作注意:请勿选中服务端窗口内容,否则会导致服务暂停。如需取消选中,可按回车键

三、Mongoose 连接配置

1. 安装 Mongoose

bash 复制代码
npm install mongoose

2. 创建配置文件

在项目根目录下创建 config 文件夹,并添加 index.js 配置文件:

javascript 复制代码
// 数据库配置参数
module.exports = {
  DBHOST: '127.0.0.1',     // 数据库主机地址
  DBPORT: 27017,           // 数据库端口
  DBNAME: 'node-ruoyi'     // 数据库名称
}

3. 创建数据库连接模块

db 文件夹下创建 db.js 文件:

javascript 复制代码
// 数据库连接模块
module.exports = function(success, error) {
  // 错误回调函数默认处理
  if (typeof error !== 'function') {
    error = () => {
      console.log('数据库连接失败')
    }
  }
  
  const mongoose = require('mongoose')
  const { DBHOST, DBPORT, DBNAME } = require('../config')
  
  // 启用严格查询模式
  mongoose.set('strictQuery', true)
  
  // 建立数据库连接
  mongoose.connect(`mongodb://${DBHOST}:${DBPORT}/${DBNAME}`)
  
  // 连接成功回调
  mongoose.connection.once('open', () => {
    console.log('MongoDB 连接成功')
    success()
  })
  
  // 连接错误回调
  mongoose.connection.on('error', () => {
    console.log('MongoDB 连接出错')
    error?.()
  })
  
  // 连接关闭回调
  mongoose.connection.on('close', () => {
    console.log('MongoDB 连接已关闭')
  })
}

4. 修改应用入口文件

更新 bin/www 文件,确保数据库连接成功后再启动服务器:

javascript 复制代码
#!/usr/bin/env node

/**
 * 模块依赖
 */
const db = require('../db/db')

// 先建立数据库连接,成功后启动应用
db(() => {
  var app = require('../app')
  var debug = require('debug')('back:server')
  var http = require('http')
  
  /**
   * 从环境变量获取端口号
   */
  var port = normalizePort(process.env.PORT || '3000')
  app.set('port', port)
  
  /**
   * 创建 HTTP 服务器
   */
  var server = http.createServer(app)
  
  /**
   * 监听指定端口
   */
  server.listen(port)
  server.on('error', onError)
  server.on('listening', onListening)
  
  /**
   * 端口号标准化函数
   */
  function normalizePort(val) {
    var port = parseInt(val, 10)
    
    if (isNaN(port)) {
      // 命名管道
      return val
    }
    
    if (port >= 0) {
      // 端口号
      return port
    }
    
    return false
  }
  
  /**
   * HTTP 服务器错误处理
   */
  function onError(error) {
    if (error.syscall !== 'listen') {
      throw error
    }
    
    var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port
    
    // 处理特定监听错误
    switch (error.code) {
      case 'EACCES':
        console.error(bind + ' 需要提升的权限')
        process.exit(1)
        break
      case 'EADDRINUSE':
        console.error(bind + ' 端口已被占用')
        process.exit(1)
        break
      default:
        throw error
    }
  }
  
  /**
   * HTTP 服务器监听事件
   */
  function onListening() {
    var addr = server.address()
    var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port
    debug('正在监听 ' + bind)
    console.log(`服务器已启动,监听端口: ${port}`)
  }
})

5. 重启应用服务

bash 复制代码
npm start

总结

通过以上配置,您的 Node.js 应用已经成功集成了 Mongoose 和 MongoDB 数据库。这种配置方式具有以下优势:

  1. 模块化设计:将数据库配置与业务逻辑分离,便于维护
  2. 错误处理完善:包含连接成功、失败和关闭的完整回调机制
  3. 启动顺序优化:确保数据库连接成功后再启动 HTTP 服务
  4. 配置灵活:通过配置文件轻松调整数据库连接参数

现在您的应用已经具备了数据库操作能力,可以开始定义数据模型和进行数据操作了。

相关推荐
煎蛋学姐2 小时前
SSM协同过滤的视频推荐系统s04mp(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·用户管理·协同过滤·ssm 框架·视频推荐系统
马克学长2 小时前
SSM薪酬管理系统b26z4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·薪酬管理系统
胡萝卜的兔3 小时前
ThinkPHP6.0 Redis 延迟队列 + 定时任务 实现超时取消订单完整部署脚本
数据库·redis·缓存
2501_944521003 小时前
rn_for_openharmony商城项目app实战-主题设置实现
javascript·数据库·react native·react.js·ecmascript
heartbeat..3 小时前
SQL 常用函数大全:聚合、字符串、数值、日期、窗口函数解析
java·数据库·sql·函数
chuxinweihui3 小时前
MySQL数据库基础
数据库·mysql
无敌的牛4 小时前
MySQL基础
数据库·mysql
进阶的小名4 小时前
[超轻量级延时队列(MQ)] Redis 不只是缓存:我用 Redis Stream 实现了一个延时MQ(自定义注解方式)
java·数据库·spring boot·redis·缓存·消息队列·个人开发
短剑重铸之日4 小时前
《7天学会Redis》Day 6 - 内存&性能调优
java·数据库·redis·缓存·7天学会redis