logo头像

aferica

搭建自己API服务器(二):添加功能模块

本文于1715天之前发表,文中内容可能已经过时。

egg是阿里巴巴团队推出的基于Node.js和Koa的为企业级框架和应用
详细文档,了解更多

20190428165355.png

添加自己的模块(例如添加book模块)

开发自己的模块主要需要添加或修改的文件有三个(如果使用mongoose的话则是四个)
分别是

添加book相关路由

1
router.get('/api/book', controller.book.index)

添加app/controller/book.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
28
29
const Controller = require('egg').Controller

class BookController extends Controller {
constructor(ctx) {
super(ctx)
}

// 获取所有类型(分页/模糊)
async index() {
const { ctx, service } = this
// 组装参数
const payload = ctx.query
// 调用 Service 进行业务处理

/**
* 此处service.book.index意思是调用service文件夹下的book.js中的index方法
* egg无需添加引入语句,会自动引入,但是路径必须正确
* 例如:如果book是在service文件夹下的other文件夹之中
* 引用用具则变为: service.other.book.index
*/
const res = await service.book.index(payload)
// 设置响应内容和响应状态码
ctx.helper.success({ctx, res})
}

// 更多
}

module.exports = BookController

添加app/service/book.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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
const Service = require('egg').Service

class BookService extends Service {

// index======================================================================================================>
async index(payload) {
let limit = 20
let page = 1
if(payload.limit) {
limit = parseInt(payload.limit)
delete payload.limit
}
if(payload.page) {
page = parseInt(payload.page)
delete payload.page
}

let res = []
let count = 0
let sort = { last_update: -1 }
count = await this.ctx.model.book.count(payload).exec()
/**
* 此处this.ctx.model.book意思是调用model文件夹下的book.js中的Book数据模型
* egg无需添加引入语句,会自动引入,但是路径必须正确
*/
res = await this.ctx.model.book.find(payload).skip((page - 1) * limit).limit(limit).sort(sort).exec()

// 数据整理,格式化
let data = res.map((e,i) => {
const jsonObject = Object.assign({}, e._doc)
jsonObject.key = i + 1 + (page - 1) * limit
delete jsonObject.page_url
delete jsonObject.have_all_info
delete jsonObject.create_time
return jsonObject
})

return { count: count, list: data, limit: limit, page: page }
}

// 更多
}

module.exports = BookService

添加app/model/book.js

注意:model文件夹下不能再新建子文件夹,否则会导致model找不到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module.exports = app => {
const mongoose = app.mongoose
const BookSchema = new mongoose.Schema({
title: { type: String, default: '' },
cover: { type: String, default: '' },
type: { type: String, default: '' },
size: { type: String, default: '' },
short_intro: { type: String, default: ''},
uploader: { type: String, default: ''},
good: { type: Number, default: 0 },
bad: { type: Number, default: 0 },
page_url: { type: String, default: ''},
last_update: { type: String, default: '' },
create_time: { type: String, default: '' }
}, {collection: 'book'})
/**
* 注意:此处{collection: 'book'}为数据库表名称,如果不自定义表名,会默认为model名称复数形式:books
*/
return mongoose.model('Book', BookSchema)
}
微信打赏

你的赞赏是对我最大的鼓励