这里写目录标题
- 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 项目就安装成功了
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;