需求

随着Nodejs的普及,前端开发的开发场景基本可以贯穿界面交互到数据存储,无缝实现全栈开发。最近在实现一个内部项目管理工具的时候,就尝试了一把接口和数据库开发。

什么是Egg.js

Egg.js是阿里开源的一套Nodejs开发框架。Egg.js官网的介绍是:

Egg.js 为企业级框架和应用而生,我们希望由 Egg.js 孕育出更多上层框架,帮助开发团队和开发人员降低开发和维护成本。

为什么选择了Egg.js,而不是Koa,Express呢,其实还是为了快速开发,减少搭建项目的时间,Egg.js已经为开发者设计了几乎最常用的目录结构,一切倾向于配置化,隐藏一些业务无关的技术细节。开发者可以更加着重考虑业务逻辑,然后在Egg.js和相关插件的支持下,开发功能即可。

Egg.js还提倡『约定优于配置』,这一点我也是很赞同,一致的约定能够减少不必要的失误,同时保证了一致的开发体验,可以方便的维护不同的项目。

初始化项目

Egg.js提供了脚手架快速初始化项目,但是要求npm >=6.1.0,这基本不是问题。

$ mkdir egg-example && cd egg-example
$ npm init egg --type=simple
$ npm i

然后启动项目

$ npm run dev
$ open http://localhost:7001

  

目录设计

因为Egg.js已经做了太多事情,我只需要关注app和config。

├── app
| ├── router.js
│ ├── controller
│ | └── home.js
│ ├── service
│ | └── user.js
│ ├── model
│ | └── user.js
├── config
| ├── plugin.js
| └── config.default.js

  

app/router.js 用于配置URL路由规则,也就是你访问的接口地址,对应的是哪个controller的逻辑。

app/controller/** 用于解析用户的输入,处理后返回相应的结果,这里其实可以写service和model的逻辑,但是按照单一职责的原则,我们会在controller主要放置参数解析和返回值,以及非数据库操作的逻辑。

app/service/** 用于编写业务逻辑层,可选,建议使用,你可以理解成对数据库操作的封装。

app/model/** 用于定义mongodb的schema,这部分很神奇的是Egg.js已经封装mongodb链接数据库,并将model绑定到了ctx上,方便调用。

config/config.default.js 用于编写配置文件,可以配置不同的开发环境,不同的变量,但是因为业务比较单一,内部使用,所以只使用了默认设置。我的项目中配置了跨域、mongoose、csrf,等等。

config.mongoose = {
url: "mongodb://127.0.0.1/*****",
options: {}
}; config.cors = {
origin: '*',
allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH'
} config.security = {
csrf: {
enable: false,
},
};

  

config/plugin.js 用于配置需要加载的插件,比如egg-mongoose,egg-cors。

module.exports = {
mongoose: {
enable: true,
package: "egg-mongoose"
},
cors: {
enable: true,
package: "egg-cors"
}
};

  

这里需要注意的是,很多博客提供的代码都是ES6的代码,在我初始化的模板中是不可行的,如下:

exports.cors = {
enable: true,
package: 'egg-cors',
}

  

开发项目

基础搭建好了,开发就变得很简单了,我遵循的逻辑是:Model-->路由-->Contoller-->Service,先设计数据库Schema,然后增加新的路由,支持对应的Controller,然后在Service中完成数据库操作。

router.js

router.get("/api/task", controller.task.index);
router.post("/api/task", controller.task.create);
router.put("/api/task/:id", controller.task.update);
router.delete("/api/task/:id", controller.task.destroy ); // 也可以简写为
router.resources('topics', '/api/task', controller.task);

controller中实现的方法具体可以参考下面的对应关系

Method Path Route Name Controller.Action
GET /posts posts app.controllers.posts.index
GET /posts/new new_post app.controllers.posts.new
GET /posts/:id post app.controllers.posts.show
GET /posts/:id/edit edit_post app.controllers.posts.edit
POST /posts posts app.controllers.posts.create
PUT /posts/:id post app.controllers.posts.update
DELETE /posts/:id post app.controllers.posts.destroy

controller/task.js

exports.index = function*() {
// ...
const result = yield this.service.task.index(this.params);
this.body = result;
}; exports.create = function*() {
// ...
const result = yield this.service.task.create(this.request.body);
this.body = result;
}; exports.update = function*() {
// ...
const result = yield this.service.task.update(this.params.id, this.request.body);
this.body = result;
}; exports.destroy = function*() {
// ...
const result = yield this.service.task.destroy(this.params);
this.body = result;
};

  

service/task.js

module.exports = app => {
class TaskService extends app.Service {
*index(params) {
let tasks = yield this.ctx.model.Task.find(params);
let result = {};
result.data = tasks;
return result;
} *create(request) {
} *update(id, request) {
} *destroy(params) {
}
}
return TaskService;
};

model/task.js

module.exports = app => {
const mongoose = app.mongoose;
const Schema = mongoose.Schema;
const TaskSchema = new Schema({
id: {type: Number},
text: {type: String},
type: {type: String},
progress: {type: Number},
open: {type: Boolean},
start_date: {type: String},
owner_id: [{type: String}],
duration: {type: Number},
parent: {type: Number}
});
return mongoose.model("Task", TaskSchema);
};

部署

Egg.js 框架内置了 egg-cluster 来启动 Master 进程,Master 有足够的稳定性,不再需要使用 pm2 等进程守护模块。只需要两个命令即可:

# 启动服务
npm start
# 关闭服务
npm run stop

结语

站在巨人的肩膀上,让我们的开发效率倍增,但是还是建议大家先从Koa2学起,对然后对比Egg.js,你就会了解它到底封装了哪些东西,为我们节省了多少工作量,后面还要继续对Egg.js的插件开发进行了解。

EggJS接口开发的更多相关文章

  1. 《连载 | 物联网框架ServerSuperIO教程》- 13.自定义视图显示接口开发,满足不同的显示需求

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  2. 《Python Web 接口开发与测试》---即将出版

    为什么要出这样一本书? 首先,今年我有不少工作是跟接口自动化相关的,工作中的接口自动化颇有成效. 我一直是一个没有测试大格局的人,在各种移动测试技术爆发的这一年,我却默默耕耘着自己的一亩三分地儿(We ...

  3. 浅谈 PHP 与手机 APP 开发(API 接口开发) -- 转载

    转载自:http://www.thinkphp.cn/topic/5023.html 这个帖子写给不太了解PHP与API开发的人 一.先简单回答两个问题: 1.PHP 可以开发客户端? 答:不可以,因 ...

  4. 支付宝WAP支付接口开发(Node/Coffee语言)

    此博客不更新很久了, 更新的文档在这, 有兴趣到这里围观: http://neutra.github.io/2013/%E6%94%AF%E4%BB%98%E5%AE%9DWAP%E6%94%AF%E ...

  5. C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取

    一.前言 当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,需要用户进行复杂的操作才可以和网站绑定,或者很多公司直接不绑定,而是每次都让用户填写账号 ...

  6. C#.NET微信公众账号接口开发系列文章整理--微信接口开发目录,方便需要的博友查询

    前言: 涉及微信接口开发比较早也做的挺多的,有时间的时候整理了开发过程中一些思路案例,供刚学习微信开发的朋友参考.其实微信接口开发还是比较简单的,但是由于调试比较麻烦,加上微信偶尔也会给开发者挖坑,并 ...

  7. C#/ASP.NET MVC微信公众号接口开发之从零开发(四) 微信自定义菜单(附源码)

    C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...

  8. APP数据接口开发的一些经验

    刚接到这样的任务时,没有感觉到任何压力,不就是给移动端应用提供数据吗?那边发来参数,这边处理数据,返回JSON.做网站开发时经常使用ajax请求后台数据,不就是这么回事吗.于是,在确认完需求后就开始干 ...

  9. 浅谈 PHP 与手机 APP 开发(API 接口开发)

    本文内容转载自:http://www.thinkphp.cn/topic/5023.html 这个帖子写给不太了解PHP与API开发的人一.先简单回答两个问题:1.PHP 可以开发客户端?答:不可以, ...

随机推荐

  1. Android手机打造你的Python&Java开发工具!

    开发者桌面 之前写过一篇文章:将Android手机打造成你的python开发者桌面 在安卓手机上通过Termux软件,创建一个模拟Linux系统,它的好处就是无需root,即可在手机中编写Python ...

  2. MySQL必知必会(汇总数据, 聚集函数)

    SELECT AVG(prod_price) AS avg_price FROM products; #AVG只能用于单个列求平均值,如想计算多个列,必须用多个AVG() SELECT AVG(pro ...

  3. dotnet core gbk 编码错误解决方案

    .Net Core GBK解码 1.添加引用 System.Text.Encoding.CodePages 2.注册   Encoding.RegisterProvider(CodePagesEnco ...

  4. 第3节:Java基础 - 必知必会(上)

    第3节:Java基础 - 必知必会(上) 本篇是基础篇的第一小节,我们从最基础的java知识点开始学习.本节涉及的知识点包括面向对象的三大特征:封装,继承和多态,并且对常见且容易混淆的重要概念覆盖和重 ...

  5. 2019CCPC秦皇岛 F Forest Program

    队友过的:https://blog.csdn.net/liufengwei1/article/details/101632506 Forest Program Time Limit: 2000/100 ...

  6. HDU4670 cube number on a tree(点分治+三进制加法)

    The country Tom living in is famous for traveling. Every year, many tourists from all over the world ...

  7. 摄像头CMOS和CCD的比较

    转载自网络,在此做一下总结,仅供参考: 1.CCD每曝光一次,在快门关闭后进行像素转移处理,将每一行中每一个像素(pixel)的电荷信号依序传入“缓冲器”中,由底端的线路引导输出至 CCD 旁的放大器 ...

  8. .NetCore部署到CentOS

    “天下熙熙,皆为利来:天下攘攘,皆为利往.”,越来越多的人涌入IT这个行业,使得技术发展日新月异之外,也会无情淘汰跟不上潮流的人,所以作为IT从业人员,一定要时刻关注前沿技术,免得有朝一日被拍在沙滩上 ...

  9. springboot中实现kafa指定offset消费

    kafka消费过程难免会遇到需要重新消费的场景,例如我们消费到kafka数据之后需要进行存库操作,若某一时刻数据库down了,导致kafka消费的数据无法入库,为了弥补数据库down期间的数据损失,有 ...

  10. 基于 HTML5 + WebGL 的 3D 太阳系系统

    前言 近年来随着引力波的发现.黑洞照片的拍摄.火星上存在水的证据发现等科学上的突破,以及文学影视作品中诸如<三体>.<流浪地球>.<星际穿越>等的传播普及,宇宙空间 ...