MongoDB2-开发api

mongoose

node中操作MongoDB数据库的模块,实现增删改查的操作。

scheme

约束MongoDB的文档数据。scheme对应文档

model

model对应集合

语法使用

打开mongodb服务器

npm install mongoose

创建a.js

var mongoose = require('mongoose');
// 数据库连接
var db = mongoose.createConnection('mongodb://stu2:stu2@localhost:27017/school',
    { useNewUrlParser: true, useUnifiedTopology: true }, err => {
        if (err) {
            console.log('-------------------------');
            console.log('数据库连接失败', err);
            console.log('-------------------------');
            return;
        }
        console.log('数据库连接成功');
    }
)
// 创建model===集合
const model = db.model('users', {
    name: { type: String, default: "大神" },
    pwd: { type: String, default: "pwd大神" },
    age: { type: Number },
    sex: { type: String }
})
// 准备插入数据
const insertObj = new model({
    name: "张安",
    pwd: "张安",
    age: 18,
    sex: "男"

})
// 增 create
insertObj.save()
    .then(res => {
        console.log(res)
        return res
    })
    .catch(err => {
        console.log("插入失败" + err)
        return false;
    })

运行

PS F:\express_mongodb_lagou> node a.js
数据库连接成功
{
  name: '张安',
  pwd: '张安',
  _id: 5f44f19c5b67fd3350848d2f,
  age: 18,
  sex: '男',
  __v: 0
}

结果
在这里插入图片描述
创建b.js

var mongoose = require('mongoose');
var db = mongoose.createConnection('mongodb://stu2:stu2@localhost:27017/school',
    { useNewUrlParser: true, useUnifiedTopology: true }, err => {
        if (err) {
            console.log('-------------------------');
            console.log('数据库连接失败', err);
            console.log('-------------------------');
            return;
        }
        console.log('数据库连接成功');
    }
)

const model = db.model('users', {
    name: { type: String, default: "大神" },
    pwd: { type: String, default: "pwd大神" },
    age: { type: Number },
    sex: { type: String }
})
// 读取的方法  Read
model.find({})
    .then(res => {
        console.log(res)
        return res
    })
    .catch(err => {
        console.log(err)
        return false
    })

运行

PS F:\express_mongodb_lagou> node b.js
数据库连接成功
[
  {
    name: '张安',
    pwd: '张安',
    _id: 5f44f19c5b67fd3350848d2f,
    age: 18,
    sex: '男',
  },
  {
    name: '张安',
    pwd: '张安',
    _id: 5f44f3c4a34d5c10fc417981,
    age: 18,
    sex: '男',
    __v: 0
  }
]

使用分页

model.find({}).limit(1)
    .then(res => {
        console.log(res)
        db.close()
        return res
    })
    .catch(err => {
        console.log(err)
        return false
    })

运行

数据库连接成功
[
  {
    name: '张安',
    pwd: '张安',
    _id: 5f44f19c5b67fd3350848d2f,
    age: 18,
    sex: '男',
    __v: 0
  }
]

接口

定义

接口就是文件(随时可接入),主要响应json数据或XML数据

开发规范 Restful API

RESTful API 设计指南

测试工具

postman:模拟http测试接口,查看接口返回数据
在这里插入图片描述

express

http.js

// 1 引入模块
const express = require('express')
var bodyParser = require("body-parser")
// 2 创建app对象,底层原理是http的createServer
const app = express()
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

// 3 路由,app.HTTP请求方式(路径,回调函数)
app.get('/', (req, res) => {
    res.send('hello')
})

// 4 启动监听端口号
app.listen(process.env.PROT || '3000')

添加学生的接口

1 路由 /stu post
2 响应任意json数据
http.js

const stuController = require(process.cwd() + '/controller/stu')
// 学生添加接口
app.post('/stu', stuController.create)

controller/stu,js

const create = async (req, res) => {
    res.send("this is stu create")
}
 // 导出方法
module.exports = {
    create: create
}
node http.js

在postman中查看接口
在这里插入图片描述

3 定义stu模块,定义创建数据的方法
models/stu.js

var mongoose = require('mongoose');
var db = mongoose.createConnection('mongodb://stu2:stu2@localhost:27017/school',
    { useNewUrlParser: true, useUnifiedTopology: true }, err => {
        if (err) {
            console.log('-------------------------');
            console.log('数据库连接失败', err);
            console.log('-------------------------');
            return;
        }
        console.log('数据库连接成功');
    }
)

const model = db.model('stu', {
    name: { type: String, default: "大神" },
    age: { type: Number },
    sex: { type: String }
})

const createModel = () => {
    const insertObj = new model(postdata);
    return insertObj.save()
        .then(res => {
            console.log(res)
            return res
        })
        .catch(err => {
            console.log("插入失败" + err)
            return false;
        })
}

// 方法导出
module.exports = {
    createModel: createModel,
}

4 调用stu模块定义创建数据的方法,返回结果
controller/stu,js

const create = async (req, res) => {
    // res.send("this is stu create")
    //  1 接收数据
    let postData = req.body
    // 2 过滤
    // 3 操作数据库
    let rs = await createModel(postData)
    // 4 判断返回
    if (rs) {
        res.send({
            meta: {
                state: 200,
                msg: "添加成功"
            },
            data: null
        })
    }
    else {
        res.send({
            meta: {
                state: 500,
                msg: "添加失败"
            },
            data: null
        })
    }
}
node http.js

在postman中查看数据
在这里插入图片描述
在这里插入图片描述

添加学生列表的接口

1 路由 /stu get
2 响应任意json数据
http.js

// 学生列表接口
app.get('/stu', stuController.list)

controller/stu,js

const list = (req, res) => {
    res.send("this is stu list")
}

// 导出方法
module.exports = {
    create: create,
    list: list
}
node http.js

在postman中查看数据
在这里插入图片描述

3 修改stu模块,增加查询数据的方法
models/stu.js

const listModel = () => {

    return model.find()
        .then(res => {
            console.log(res)
            return res
        })
        .catch(err => {
            console.log("查询失败" + err)
            return [];
        })
}
// 方法导出
module.exports = {
    createModel: createModel,
    listModel: listModel
}

4 修改控制器调用定义查询数据的方法,返回结果
controller/stu,js

const list = async (req, res) => {
    // res.send("this is stu list")
  
    // 3 获取数据
    let data = await listModel(ship, getData.size)
    // 4 相应数据

    res.send({
        meta: {
            state: 200,
            msg: "查询数据成功"
        },
        data: data
    })


}

node http.js

在postman中查看数据
在这里插入图片描述

添加学生列表分页的接口

1 修改控制器列表 /stu get 传参pageno pagesize

controller/stu.js

const list = async (req, res) => {
    // res.send("this is stu list")
    // 1 修改控制器,接受pageno  pagesize
    let getData = req.query
    // console.log(getData)
    // 2 过滤
    let skip = (parseInt(getData.pageno) - 1) * parseInt(getData.pagesize)
    // 3 获取数据
    let data = await listModel(skip, parseInt(getData.pagesize))
    // 4 相应数据

    res.send({
        meta: {
            state: 200,
            msg: "查询数据成功"
        },
        data: data
    })


}

2 修改模型调用定义查询数据的方法,返回结果

const listModel = (skipnum, limitnum) => {

    return model.find().skip(skipnum).limit(limitnum)
        .then(res => {
            console.log(res)
            return res
        })
        .catch(err => {
            console.log("查询失败" + err)
            return [];
        })
}
node http.js

在postman中查看数据
在这里插入图片描述

接口文档 开发 apiDoc

接口文档:告诉前段有哪些接口,接口有什么参数
apidoc 快速生成接口文档,基于注释生成

npm i apidoc  //一次

项目根目录创建apidoc.json,一次

{
  "name": "example",
  "version": "0.1.0",
  "description": "apiDoc basic example",
  "title": "Custom apiDoc browser title",
  "url" : "https://api.github.com/v1"
}
{
    "name": "教学管理系统接口文档",
    "version": "1.0.0",
    "description": "接口文档",
    "title": "Custom apiDoc browser title",
    "url": "http://localhost:3000"
}

写接口注释
js格式

/**
 * @api {get} /user/:id Request User information
 * @apiName GetUser
 * @apiGroup User
 *
 * @apiParam {Number} id Users unique ID.
 *
 * @apiSuccess {String} firstname Firstname of the User.
 * @apiSuccess {String} lastname  Lastname of the User.
 */
/**
 * @api {get} /stu  学生模块列表接口
 * @apiName Add
 * @apiGroup Stu
 *
 * @apiParam {Number} pageno 当前页是第几页.
 * @apiParam {Number} pagesize  每页显示条数
 *
 * @apiSuccess {String}  meta 状态码&提示信息
 * @apiSuccess {String}  data  返回的数据
 */

生成接口文档

// 终端
apidoc -i ./接口注释目录 -o ./接口存放目录 
apidoc -i ./controller  -o ./doc 

在doc目录下查看index.html
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值