使用koa2+mongodb搭建后端api项目

一、环境搭建

1
自行安装 node + npm

二、安装脚手架并创建项目

1
2
npm i -g koa-generator
koa2 <pro_name>

三、安装依赖并启动项目

1
2
3
npm i
npm i koa2-cors mongoose (跨域还有操作数据库的库)
npm dev (启动命令自行查看package.json)

四、数据库操作(模块化开发)

脚手架生成的初始文件目录结构

创建mongodb文件夹

mongodb文件夹结构

1
2
3
controller文件夹: 存放对数据库增删改查的函数的文件,文件名对应数据库中的一个表(集合);
models文件夹: 存放由schemas生成的表,文件名同理;
schemas文件夹: 存放schemas文件

模块化开发

  1. 先创建mongodb/index.js文件,再在app.js中导入,导入时注意模块导入顺序
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    /**
    * mongodb/index.js
    * @file 连接数据库
    * @author kenis
    */
    const mongoose = require("mongoose");

    mongoose.connect("mongodb://192.168.43.158:27017/car");
    mongoose.Promise = global.Promise;

    let db = mongoose.connection;

    // 监听打开成功还是失败
    db.on("error", err => {
    // 链接失败
    console.log(err, "链接失败");
    });
    db.once("connected", function () {
    // 链接成功
    console.log("链接成功");
    });
    db.once("disconnected", function () {
    // 断开链接
    console.log("断开链接");
    });

    module.exports = db;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/**
* app.js
*/
const Koa = require("koa");
const app = new Koa();
// const views = require("koa-views");
const json = require("koa-json");
const onerror = require("koa-onerror");
const bodyparser = require("koa-bodyparser");
const logger = require("koa-logger");
const db = require("./mongodb");

// error handler
onerror(app);

// middlewares
app.use(
bodyparser({
enableTypes: ["json", "form", "text"],
})
);
app.use(json());
app.use(logger());
app.use(require("koa-static")(__dirname + "/public"));

// 跨域处理
const cors = require("koa2-cors");
app.use(cors());

// 视图配置
// app.use(
// views(__dirname + "/views", {
// extension: "pug",
// })
// );

// logger
app.use(async (ctx, next) => {
const start = new Date();
await next();
const ms = new Date() - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});

// router 修改路由的注册方式,通过遍历routes文件夹读取文件
const fs = require("fs");
fs.readdirSync("./routes").forEach(route => {
let api = require(`./routes/${route}`);
app.use(api.routes(), api.allowedMethods());
});

// error-handling
app.on("error", (err, ctx) => {
console.error("server error", err, ctx);
});

module.exports = app;

  1. 创建数据库集合的模板类型和模型
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /**
    * mongodb/schemas/car.js
    * 创建模板类型
    */
    const mongoose = require("mongoose");
    const sportsCarSchema = new mongoose.Schema({
    // 说明集合中要存储的字段,字段类型
    name_zh_CN: String,
    name_en_US: String,
    });

    module.exports = { sportsCarSchema };
1
2
3
4
5
6
7
/**
* mongodb/models/car.js
*/
const { sportsCarSchema } = require("../schemas/car");
const mongoose = require("mongoose");
let SportsCarModel = mongoose.model("SportsCar", sportsCarSchema);
module.exports = { SportsCarModel };
  1. 创建操作数据库的控制器文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    /**
    * mongodb/controller/car.js
    */
    const { SportsCarModel } = require("../mongodb/models/car");

    /**
    * 查询所有数据
    * @param {*} ctx
    * @returns
    */
    const findAll = async ctx => {
    let code = 0; // 状态码 0:成功 -1:失败
    let result = ""; // 返回内容
    try {
    let doc = await SportsCarModel.find({});
    code = 0;
    result = "查找成功";
    data = doc;
    } catch (err) {
    code = -1;
    result = "查找失败";
    data = err;
    }

    ctx.response.body = {
    code,
    result,
    data,
    };
    return result;
    };

    /**
    * 删除
    * @param {*} ctx
    * @returns
    */
    const delOne = async ctx => {
    let code = 0; // 状态码 0:成功 -1:失败
    let result = ""; // 返回内容
    try {
    let doc = await SportsCarModel.deleteOne(ctx.request.body);
    code = 0;
    result = "删除成功";
    data = doc;
    } catch (err) {
    code = -1;
    result = "删除失败";
    data = err;
    }

    ctx.response.body = {
    code,
    result,
    data,
    };
    return result;
    };

    /**
    * 添加
    * @param {*} ctx
    * @returns
    */
    const addOne = async ctx => {
    let code = 0; // 状态码 0:成功 -1:失败
    let result = ""; // 返回内容
    try {
    let doc = await SportsCarModel.create(ctx.request.body);
    code = 0;
    result = "添加成功";
    data = doc;
    } catch (err) {
    code = -1;
    result = "添加失败";
    data = err;
    }

    ctx.response.body = {
    code,
    result,
    data,
    };
    return result;
    };

    /**
    * 通过id修改数据
    * @param {*} ctx
    * @returns
    */
    const updateOne = async ctx => {
    let code = 0; // 状态码 0:成功 -1:失败
    let result = ""; // 返回内容
    try {
    const { id, update } = ctx.request.body;
    let doc = await SportsCarModel.findByIdAndUpdate(id, update);
    code = 0;
    result = "修改成功";
    data = doc;
    } catch (err) {
    code = -1;
    result = "修改失败";
    data = err;
    }

    ctx.response.body = {
    code,
    result,
    data,
    };
    return result;
    };

    module.exports = { findAll, delOne, addOne, updateOne };
  2. 创建路由文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    /**
    * routes/cars.js
    */
    const router = require("koa-router")();
    const {
    findAll,
    delOne,
    addOne,
    updateOne,
    } = require("../mongodb/controller/car");

    router.prefix("/cars");

    /**
    * 查询所有
    */
    router.get("/list", findAll);

    /**
    * 删除
    */
    router.delete("/del", delOne);

    /**
    * 添加
    */
    router.post("/add", addOne);

    /**
    * 修改
    */
    router.post("/update", updateOne);

    module.exports = router;