3

上节回顾

  • koa搭建服务端
  • 运行服务端代码(如何在命令行中调用本地依赖包)
  • 借助vs code调试代码

工作内容

  • 连接数据库
  • 创建数据结构

准备工作

  • 安装robo //数据库可视化工具
  • 安装mongoDb //我已经安装过了,也没遇到什么坑,就不再演示了

mongoDb

  • npm i -S mongoose // 安装mongoose
  • brew services start mongodb-community //启动mongoDb
  • 创建目录

    • |-server

      • |-- db

        • |--- index.js //数据库连接
      • |-- model

        • |--- user.js //数据存储结构

连接数据库

这里mongodb安装的时候,没有设置密码,直接连接使用;

// 文件:db/index.js
const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/demo');
const db = mongoose.connection;
// mongoose.connect连接mongodb,返回一个异步对象,可监听事件;
db.on('connected', () => {
  console.log('数据库连接成功');
});

db.on('error', () => {
  console.log('发生错误')
})
db.on('disconnected', () => {
  console.log('断开连接')
})

/server目录下,运行node db/index.js打印出“数据库连接成功”即可。

优化连接

  • 将域名、端口、数据库名提出
  • mongoose.connection导出
// 文件:新建/server/config/db.js
module.exports = {
  port: 27017, // 默认端口
  host: 'localhost',
  database: 'demo', // 自定义数据库名
}
// 优化/server/bd/index.js
const mongoose = require('mongoose');
const DB = require('../config/db');

const { port, host, database } = DB;
const DB_URL = `mongodb://${host}:${port}/${database}`;
// mongoose.connect连接mongodb,返回一个异步对象,可监听事件;
mongoose.connect(DB_URL);
const db = mongoose.connection;

db.on('connected', function() {
  console.log(`Mongoose connection open to ${DB_URL}`)
})
db.on('error', function(err){
  console.log(`Mongoose connection error: ${err}`)
})
db.on('disconnected', function() {
  console.log('Mongoose connection disconnected')
})

module.exports = mongoose;

创建数据结构

数据字段

// 文件:server/model/user.js
const mongoose = require('../db/index');

const Schema = mongoose.Schema;
// 定义数据结构
const userSchema = Schema({
  __v: { // __v双下划线,默认生成
    select: false // select:false查询不会将该字段查出
  },
  avatar: {
    type: String
  },
  account: {
    type: String,
    required: true
  },
  password: {
    type: String,
    required: true,
    select: false
  },
  alias: {
    type: String
  },
  telephone: {
    type: String,
    select: false
  },
  email: {
    type: String,
    select: false
  }
})
// 后续的增删改查是通过导出的User Model实现。
module.exports = mongoose.model('User', userSchema);
// 文件:server/model/approve.js
const mongoose = require('../db/index');

const Schema = mongoose.Schema;

const approveSchema = Schema({
  name: {
    type: String,
    required: true
  },
  category: {
    type: String,
    required: true
  },
  description: {
    type: String,
    select: false
  },
  author: {
    type: Schema.Types.ObjectId,  // 注意作者
    ref: 'User',
    required: true
  },
  createtime: {
    type: Number,
    required: true
  },
  latesttime: {
    type: Number,
    required: true
  }
})

module.exports = mongoose.model('Approve', approveSchema);
  • Schema定义参考文档
  • approveSchemaauthortype:Schema.Types.ObjectId, ref='User',新增审批的时候,将用户的Id赋值给author即可,后续通过populate,可以通过用户Id查出用户信息替换该Id赋值给author字段。

参考文档

mongoose
Schema定义参考文档
mongoose一对多关系方案


米花儿团儿
1.3k 声望75 粉丝