涉及内容: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
输出以下信息表示开启成功
9、关闭MongoDB
mongod --shutdown -f /tool/mongodb/mongodb.conf
输出以下信息表示关闭成功
10、在启动MongoDB的情况下连接MongoDB数据库(此处也可以下载Compass可视化如软件连接数据库并进行操作)
mongo
输出一下信息表示连接成功
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中有三个很重要的概念,分别是Schema、Model和Entity。
- 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请求一下 源码