Node.js : 0.10.32
Express : 4.10.2
MongoDB : 2.6.1
Nodemon: 2.0.19
express 是 Node.js 上最流行的 Web 开发框架,正如他的名字一样,使用它我们可以快速的开发一个 Web 应用。我们用 express 来搭建我们的博客,打开命令行,输入:
$ npm install -g express-generator
安装 express 命令行工具,使用它我们可以初始化一个 express 项目。
注: 我们也可自己手动搭建工程目录!
在命令行中输入:
$ express -e blog
$ cd blog && npm install
初始化一个 express 项目并安装所需模块!
注: 看需求配置相应模块
npm install cors
npm install mongoose
nmp install nodemon
{
"dependencies": {
"cors": "^2.8.5",
"express": "^4.18.1",
"mongoose": "^6.4.5",
"nodemon": "^2.0.19"
}
}
然后运行: 将项目启动
nodemon app.js
MongoDB 是一个基于分布式文件存储的 NoSQL(非关系型数据库)的一种,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 支持的数据结构非常松散,是类似 json 的 bjson 格式,因此可以存储比较复杂的数据类型。MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB 没有关系型数据库中行和表的概念,不过有类似的文档和集合的概念。文档是 MongoDB 最基本的单位,每个文档都会以唯一的 _id 标识,文档的属性为 key/value 的键值对形式,文档内可以嵌套另一个文档,因此可以存储比较复杂的数据类型。集合是许多文档的总和,一个数据库可以有多个集合,一个集合可以有多个文档。
models/db.js
const mongoose = require("mongoose")
mongoose.connect( "mongodb://localhost:27017/clothing", (err) => {
if (!err) {
console.log("数据库连接成功!");
}
})
module.exports = mongoose
models/model.js
const mongoose = require("./db")
// 模型类
const Schema = mongoose.Schema
// 衣服型号模型
const sizeTypeSchema = new Schema({
title: String,
sort : Number
})
// 衣服属性模型
const clotheSchema = new Schema({
name : String,
desc: String,
sort: String,
// 关联外键
size_id: {
type: Schema.Types.ObjectId,
ref: "sizeType"
}
})
// 映射表关系
const sizeModel = mongoose.model("sizeType", sizeTypeSchema)
const clotheModel = mongoose.model("clothe", clotheSchema)
module.exports = { sizeModel, clotheModel }
const express = require("express")
const router = express.Router()
const { sizeModel, clotheModel } = require("../models/model")
// 获取数据
router.get("/clothe", async(req, res)=> {
let keyWord = req.query.keyWord // 搜索关键字
let clothes
if ( keyWord ) {
// 正向查询数据
clothes = await clotheModel.find({ "name":{ $regex: keyWord } }).populate("size_id") .exec()
}else{
clothes = await clotheModel.find({}).populate("size_id") .exec()
}
res.json({ data: clothes })
})
// 反向查询
router.get("/size", async(req, res)=> {
// 没有外键的模型对象去查询有外键的关联对象查找; 衣服型号 =>> 衣服型号对应的属性
let data = await sizeModel.aggregate([
{
$lookup: {
from: "clothes", // 关联字段的表名
localField: "_id", // 关联字段
foreignField: "size_id", // 外键关联的字段
as: "clothe" // 查询关联的表中数据的数组
}
}
])
res.json({ data })
})
// 数据添加
router.post("/addCloth", async(req, res) =>{
let result = await clotheModel.create( req.body )
res.json({
msg: "ok",
code: "201",
result
})
})
// 删除
router.delete("/delCloth/:_id", async (req, res)=>{
let _id = req.params._id
await clotheModel.deleteOne({ _id })
res.send({"code": 201, msg: "删除成功!"})
})
// 修改
router.patch("/updateCloth/:_id", async(req, res) =>{
let _id = req.params._id
await clotheModel.updateOne({ _id }, req.body).exec()
res.json({
mag: "ok",
code: 201
})
})
module.exports = router
入口文件
app.js
const express = require("express")
const cors = require("cors")
// 引入路由对象
const indexRouter = require('./routers/index')
const app = express()
// 跨域
app.use( cors() )
// post 接收参数
app.use( express.urlencoded( { "extended": false } ) )
app.use( express.json() )
// 路由注册
app.use( indexRouter )
app.listen(8000, ()=> {
console.log( 'server runing node!')
})