前端初探数据库

117 阅读1分钟

涉及内容:MongoDB、Mongoose、Compass、一台正在运行的服务器

服务器部署

1、进入工具目录

cd /tool

2、下载MongoDB(注意这里如何下载80开头的版本可能会出现bin文件夹下屋mongo文件也就不能使用该指令,及后续连接mongdb服务)

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.15.tgz

3、解压MongoDB

tar -zxvf mongodb-linux-x86_64-rhel80-5.0.6.tgz -C /tool

4、重命名目录

mv mongodb-linux-x86_64-rhel80-5.0.6 mongodb

5、进入目录并创建文件夹与日志文件

cd mongodb && mkdir data && mkdir log && touch log/mongodb.log

6、生效环境变量

echo "export PATH=$PATH:/tool/mongodb/bin" >> ~/.bash_profile 
source ~/.bash_profile

7、手动增加一些配置,方便管理MongoDB相关文件

# 数据库 
dbpath=/tool/mongodb/data 
# 日志文件 
logpath=/tool/mongodb/log/mongodb.log 
# 使用追加的方式更新日志 
logappend=true 
# 端口 
port=27017 
# 以守护进程的方式运行MongoDB(创建服务器进程) 
fork=true 
# 启用用户验证 
# auth=true 
# 绑定服务IP(绑定127.0.0.1只能本机访问,若不指定则默认本地所有IP) 
bind_ip=0.0.0.0

8、启动MongoDB

mongod -f /tool/mongodb/mongodb.conf

输出以下信息表示开启成功

image.png 9、关闭MongoDB

mongod --shutdown -f /tool/mongodb/mongodb.conf

输出以下信息表示关闭成功

image.png

10、在启动MongoDB的情况下连接MongoDB数据库(此处也可以下载Compass可视化如软件连接数据库并进行操作)

mongo

输出一下信息表示连接成功

image.png

Node接口服务开发

1、在src文件夹下创建database/index.js文件。使用connect()连接数据库,使用connection()监听数据库状态事件。

import Mongoose from "mongoose"; 
import AppConfig from "../app.config"; 
const { connect, connection } = Mongoose;
const { mongodb: { host, password, port, username } } = AppConfig; connect(`mongodb://${username}:${password}@${host}:${port}/mall`, { 
    authSource: "admin",
    useNewUrlParser: true, 
    useUnifiedTopology: true 
});
connection.on("connected", () => console.log("数据库连接成功")); 
connection.on("disconnected", () => console.log("数据库连接断开"));
connection.on("error", () => console.log("数据库连接异常"));

2、启动本地node接口服务

npm start

3、定义数据 mongoose中有三个很重要的概念,分别是SchemaModelEntity

  • Schema: 表示模式,一种以文档形式存储的数据库模型骨架,不具备数据库操作能力
  • Model: 表示模型,由Schema生成的模型,具备抽象属性与数据库操作能力
  • Entity: 表示实例,由Model创建的实例,具备操作数据库操作能力
import Day from "dayjs";

export default {
  brand: {
    match: /^.{2,200}$/,
    msg: "品牌只能由2到200位任意字符组成",
    required: true,
    trim: true,
    type: String
  },
  code: {
    match: /^[A-Za-z0-9]{4,30}$/,
    msg: "条形码只能由4到30位英文或数字组成",
    required: true,
    trim: true,
    type: String
  },
  createtime: {
    default: Day().format("YYYY-MM-DD HH:mm:ss"),
    match: /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/,
    msg: "创建日期由系统自动生成",
    required: true,
    trim: true,
    type: String
  },
  description: {
    match: /^.{2,500}$/,
    msg: "描述只能由2到500位任意字符组成",
    required: true,
    trim: true,
    type: String
  },
  name: {
    match: /^[\u4e00-\u9fa5A-Za-z\d-\s]{2,200}$/,
    msg: "名称只能由2到200位中文、英文、数字、中划线或空格组成",
    required: true,
    trim: true,
    type: String
  },
  origin: {
    match: /^[\u4e00-\u9fa5A-Za-z\d-]{2,100}$/,
    msg: "产地只能由2到100位中文、英文、数字或中划线组成",
    required: true,
    trim: true,
    type: String
  }
};

4、定义接口

import { AsyncTo } from "@yangzw/bruce-us/dist/node";

import { Product, ProductModel } from '../../models/index'
import { CheckData } from "../../utils/setting";
import AppConfig from "../../app.config";

const Router = KoaRouter();

Router.post(`${AppConfig.publicPath}/product/create`, async ctx => {
  const params = ctx.request.body;
  // 校验全部字段是否为空
  if (!CheckData(params, 5)) {
    ctx.body = { code: 300, msg: "产品信息都不能为空" };
    return false;
  }
  // 校验全部字段是否符合正则
  const checkMsg = Object.entries(params).reduce((t, v) => {
    const { match, msg } = Product[v[0]];
    return !t && !match.test(v[1]) ? { code: 400, msg } : t;
  }, "");
  if (checkMsg) {
    ctx.body = checkMsg;
    return false;
  }
  // 判断产品是否存在
  const [err1, res1] = await AsyncTo(ProductModel.findOne({ code: params.code }));
  if (err1) {
    ctx.body = { code: 400, msg: "新增产品失败" };
    return false;
  }
  if (res1) {
    ctx.body = { code: 400, msg: "当前产品已存在" };
    return false;
  }
  // 新增产品
  const [err2, res2] = await AsyncTo(ProductModel.create(params));
  if (!err2 && res2) {
    ctx.body = { code: 200, data: res2, msg: "新增产品成功" };
  } else {
    ctx.body = { code: 400, msg: "新增产品失败" };
  }
});

export default Router;

5、用postman请求一下 源码