【架构师(第四十篇)】 服务端开发之连接 Mongodb 数据库

1,060 阅读2分钟

Mongodb 和 Mongoose

Mongodb

Mongodb 数据库前面已经安装过了。

创建一个 imooc_lego_course 数据库,一个 work collection

image.png

点击 create 完成创建。

image.png

Mongoose

安装

npm i mongoose -S

添加 mongodb 的配置文件

module.exports = {
  // mongodb 连接配置
  mongodbConf: {
    host: 'localhost',
    port: '27017',
    dbName: 'imooc_lego_course',
  },
}

封装 mongoose ,连接 mongodb

// src\db\mongoose.js

const mongoose = require('mongoose')
const { mongodbConf } = require('../config/index')

const { host, port, dbName, user, password } = mongodbConf

// 拼接连接字符串
let url = `mongodb://${host}:${port}` // dev 环境
if (user && password) {
  url = `mongodb://${user}:${password}@${host}:${port}` // prd 环境
}


// 开始连接( 使用用户名和密码时,需要 `?authSource=admin` )
mongoose.connect(`${url}/${dbName}?authSource=admin`, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
})

// 连接对象
const db = mongoose.connection

db.on('error', err => {
  console.error('mongoose connect error', err)
})

// 执行 node src/db/mongoose.js 测试连接
db.once('open', () => {
   // 用以测试数据库连接是否成功
   console.log('mongoose connect success')
})

module.exports = mongoose

控制台执行 node src/db/mongoose.js ,已正确连接数据库。

image.png

新建 model

// src\models\WorksModel.js

const mongoose = require('../db/mongoose')

const WorkScheme = mongoose.Schema(
  {
    // mongodb 会自动生成 _id,不用自己专门定义
    //标题
    title: String,
    // 页面的组件列表
    components: [Object],
    // 页面的属性
    props: Object,
    setting: Object,
  },
  {
    timestamps: true
  }
)

const WorkModel = mongoose.model('work', WorkScheme)

module.exports = {
  WorkModel
}

进一步测试数据库连接

// src\routes\index.js

const router = require('koa-router')()
const packageInfo = require('../../package.json')
const testMysqlConn = require('../db/mysql2')
const ENV = require('../utils/env')
const { WorkModel } = require('../models/WorksModel')

// 测试数据库连接
router.get('/api/db-check', async (ctx) => {
  // 测试 mysql 数据库连接
  const mysqlRes = await testMysqlConn()

  // 测试 mongodb 数据库连接
  let mongodbConn
  try {
    mongodbConn = true
    await WorkModel.findOne()
  } catch (error) {
    mongodbConn = false
  }

  ctx.body = {
    errno: 0,
    data: {
      name: 'biz editor server',
      version: packageInfo.version,
      ENV,
      mysqlConn: mysqlRes.length > 0,
      mongodbConn
    }
  }
})

module.exports = router

访问 http://localhost:3000/api/db-check,可以看到 mongodbConn 字段的值为 true, 说明数据库连接成功了。

image.png

Date 和时区

mysqlMongodb 在查询数据时,看着时间都不对,之间相差了八个小时,这跟时区有关系。

nodejs 中,new Date() 会显示世界标准睡觉,和北京时间相差八个时区,也就是八个小时,同理, new Date('2022-06-18 14:00:00') 的结果是 2022-06-18T06:00:00.000Z,也相差八个小时。

如果想要获取当前时区的时间,只需要使用 toString() 即可。

可以使用一些第三方库来进行格式化,比如 date-fns

console.log('new Date()')
console.log()
console.log(new Date())
console.log()
console.log("new Date('2022-06-18 14:00:00')")
console.log()
console.log(new Date('2022-06-18 14:00:00'))
console.log()
console.log("new Date().toString()")
console.log()
console.log(new Date().toString())

控制台打印结果如下

image.png