这里写目录标题

  • 1、首先,先进行安装
  • 1-1、新建一个项目
  • 1-2、需要配置安装相关的模块:
  • 1-3、运行项目:
  • 2、使用数据库MongoDB
  • 2-1、MongoDB的简介
  • 2-2、连接数据库
  • 2-2-1、model / db.js
  • 2-2-2、model / model.js
  • 2-3、路由控制
  • 2-4、app.js 入口文件


1、首先,先进行安装

express 是 Node.js 上最流行的 Web 开发框架,正如他的名字一样,使用它我们可以快速的开发一个 Web 应用。我们用 express 来搭建我们的博客,打开命令行,输入:

npm install -g express-generator

1-1、新建一个项目

在命令行中输入:

express 项目名称
cd 项目名称
npm install

如下图:

Express mongoose 封装_express

这样一个初始化express 项目就安装成功了

1-2、需要配置安装相关的模块:

npm install cors    ----跨域
npm install mongoose    (目前自己需要mongoose6版本)

1-3、运行项目:

nodemon

2、使用数据库MongoDB

2-1、MongoDB的简介

MongoDB 是一个基于分布式文件存储的 NoSQL(非关系型数据库)的一种,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 支持的数据结构非常松散,是类似 json 的 bjson 格式,因此可以存储比较复杂的数据类型。MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

MongoDB 没有关系型数据库中行和表的概念,不过有类似的文档和集合的概念。文档是 MongoDB 最基本的单位,每个文档都会以唯一的 _id 标识,文档的属性为 key/value 的键值对形式,文档内可以嵌套另一个文档,因此可以存储比较复杂的数据类型。集合是许多文档的总和,一个数据库可以有多个集合,一个集合可以有多个文档。

2-2、连接数据库

首先新建一个文件夹

db是用来连接数据库的
model是模型类

2-2-1、model / db.js
const mongoose = require('mongoose')

mongoose.connect("mongodb://127.0.0.1:27017/api_exam2", (err) => {
    if (err) {
        console.log('数据库连接失败');
    }
    console.log("数据库api_exam2连接成功");
})

module.exports = mongoose
2-2-2、model / model.js
const mongoose = require('./db')
var Schema = mongoose.Schema

// 登录的模型
var loginSchema = Schema({
    mobile:String,
    password:String,
})


// 商城模型
var shopSchema = Schema({
    img:String,
    name:String,
    type:Boolean
})

// 我的书架
var bookSchema = Schema({
    bookName:String,
    type:{
        type:Boolean,
        default:true
    }
})


// 衣服型号模型 
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 loginModel = mongoose.model('login', loginSchema, "login")
const shopModel = mongoose.model('shop', shopSchema, "shop")
const bookModel = mongoose.model('book', bookSchema, "book")

const sizeModel = mongoose.model("sizeType", sizeTypeSchema)
const clotheModel = mongoose.model("clothe", clotheSchema)


// bookModel.create({
//     bookName:"呼啸山庄",
//     type:false
// })

module.exports = { loginModel,shopModel,bookModel, sizeModel, clotheModel}

2-3、路由控制

var express = require('express');
var router = express.Router();
var mongoose = require("mongoose")
var jwt = require('jsonwebtoken')
const { loginModel, shopModel, bookModel } = require("../model/model")

//登录 生成token
router.post("/login", async (req, res) => {
  let data = req.body
  await loginModel.create(data)
  let user = {
    username: 'admin',
  }
  let token = 'Bearer ' + jwt.sign(user, 'fxh', { expiresIn: '1h' })
  res.send({
    token
  })

})



/* 图书商城 获取数据 搜索 */
router.get("/shop", async (req, res) => {
  // 搜索
  let name = req.query.name
  let regName = new RegExp(name)
  console.log(regName, "name11111111111");
  let data = await shopModel.find()
  if (name) {
    data = await shopModel.find({ name: regName })
  }
  res.send({
    data,
    code: 200
  })
})

/* 图书商城添加  */
// router.post("/addShop", async (req, res) => {
//   let body = req.body
//   console.log(body, '1111111111111111111');
//   let data = shopModel.create(body)
//   console.log(data);
//   res.send({
//     data,
//     code: 200,
//     mes: "添加成功"
//   })
// })


// ------------------------------------------------------

/* 我的书架 获取数据 */
router.get("/book", async (req, res) => {
  let data = await bookModel.find()
  res.send({
    data,
    code: 200
  })
})

/* 我的书架 添加数据 */
router.post("/addbook", async (req, res) => {
  let body = req.body
  let a = await bookModel.find(body)
  // console.log(a,'aaaaaaaaaaaaaaaaaaa');
  if (a.length <= 0) {
    let data = await bookModel.create(body)
    // console.log(data);
    res.send({
      data,
      code: 200,
      mes: "添加成功"
    })
  } else {
    res.send({
      mes: "数据已存在"
    })
  }
})

/* 我的书架删除数据 */
router.delete("/delbook/:id", async (req, res) => {
  let id = req.params.id
  let data = await bookModel.deleteOne({ _id: id })
  res.send({
    code: 200,
    data,
    mes: "删除成功"
  })
})

/* 我的书架修改数据 */
router.put("/editbook/:id", async (req, res) => {
  let id = req.params.id
  let body = req.body
  // console.log(body,'edit');
  let data = await bookModel.updateOne({ _id: id }, { $set: body })
  res.send({
    code: 200,
    data,
    mes: "修改成功"
  })
})

// 头像
router.post('/uploadImg', async (req, res) => {
  let form = new multiparty.Form()
  form.uploadDir = 'upload'
  form.parse(req, (err, formData, imgData) => {
    console.log(imgData, "111111111111111111111111111111");
    res.send({
      path: "http://localhost:3000/" + imgData.file[0].path
    })
  })
})


module.exports = router;

例子:

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

2-4、app.js 入口文件

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
// 跨域
var cors = require("cors")

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();
app.use(cors())
// 静态资源,上传图片用
app.use("/upload",express.static("upload"))

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  console.log(err,"错误");
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;