Koa从零搭建到Api实现项目的搭建方法


Posted in Javascript onJuly 30, 2019

什么是Koa?

Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。

Koa vs Express

Koa使用promises和async函数来摆脱回调地狱的应用并简化错误处理。它暴露自己ctx.request和ctx.response对象而不是节点req和res对象。另一方面,Express 使用其他属性和方法扩充节点req和res对象,并包括许多其他“框架”功能,例如路由和模板,Koa没有。

因此,如果你希望更接近node.js和传统的node.js样式编码,你可能希望坚持使用Connect / Express或类似的框架。如果你想摆脱回调,请使用Koa。

总结

Koa是一个比Express更精简,使用node新特性的中间件框架,相比之前express就是一个庞大的框架

  • 如果你喜欢diy,很潮,可以考虑Koa,它有足够的扩展和中间件,而且自己写很简单
  • 如果你想简单点,找一个框架啥都有,那么先Express

如果你有兴趣了解更多不同,请访问Koa vs Express

Koa 项目搭建

注意,本篇教程面向有一定Koa使用经验的用户。如果,你还不了解Koa,请先看下面的文档Koa 中文文档

Koa 文档过于精简,虽然将每一个API都进行解释说明,但还是很难将其组织起来进行应用,对于初学者来说可谓是很不友好。

笔者第一个Koa项目,将所有接口,逻辑,配置等全部写在了app.js中,虽说完美运行,但是可读性,可维护性极差,所以一个好的目录结构尤为重要

目录创建

  • config - 配置
  • models - 数据库模型(ROM)
  • controller - 控制器
  • middlewares - 中间件
  • public - 静态资源
  • service - 服务
  • router - 路由
  • app.js - 启动文件

依赖安装

创建好项目目录后我们需要安装一些依赖,来供我们使用

  • babel-core/babel-preset-es2015 - 让 nodeJs 支持 es6 modules
  • koa - koa2
  • koa-body - request body 解析
  • koa-cache-control - 缓存控制
  • koa-compress - gzip
  • koa-cors - 跨域
  • koa-logger - 日志
  • koa-onerror - 错误处理
  • koa-router - 路由
  • koa-session - session
  • koa-static - 静态资源服务
  • koa-helmet - 安全
  • md5 - md5 加密
  • mkdirp - 递归创建目录

可以根据自己的需求进行选择,但是一些依赖是必须安装的

  • koa - koa2
  • koa-body - request body 解析
  • koa-router - 路由

后面的内容会讲解每个插件有什么用,如何去用。

目录详解

config

config是我们的配置文件,比如:

  • 数据库(mysql,oracle,redis等)
  • OSS
  • ...

实际运用:

  • confirg
    • database.config.js(新建)

database.config.js

export default {
 database: '',
 username: '',
 password: '',
 dialect: '',
 host: '',
 port: 3306
}

具体配置之后会跟大家仔细讲解。

models

models文件夹主要是我们的数据库模型(ORM),存储数据库映射文件,eg:

  • models
    • index.js - 入口文件
    • user.js - 对应数据库中的user表

index.js

import Sequelize from 'sequelize'
import config from '../config/database.config'
const sequelize = new Sequelize(config)
export const user = sequelize.import(__dirname + '/user')
export default {
 user,
 sequelize
}

以下序号代表代码行号:

  1. 引入sequelize,它是一个ORM框架,之后会详细讲解它的使用
  2. 引入我们之前在config中创建的数据库配置文件呢
  3. 使用sequelize连接数据库
  4. 将本地数据库映射文件导出供我们使用

controller

controller为控制层,主要处理外部请求。调用service层,将service返回的内容整合后返回给调用方

举例:

const user = require('../service/user')
const findAllUser = async (ctx) => {
 const data = ctx.request.body
 const result = await user.findAllUser(data)
 ctx.body = send({data: result})
}
module.exports = {
 findAllUser
}

以下序号代表代码行号:

  1. 获取请求体
  2. 调用service层
  3. 将service返回的内容返回给调用者(send是自定义的数据格式化方法)

service

service作为服务层主要做相信的业务逻辑处理,数据处理等,将结果返回给controller层

举例:

const db = require('../models/')
const findAllUser = async () => {
 const result = await db.user.findAll()
 return result
}
module.exports = {
 findAllUser
}

以下序号代表代码行号:

  • 获取数据库映射文件,因为要操作数据库
  • 从数据库中查寻全部用户(db.user.findAll()为sequelize中提供的查询方法)
  • 返回给controller

routers

router管理我们的路由,也就是接口地址

举例:

const user = require('../controller/user')
const koa_router = require('koa-router');
const router = koa_router();
router.post('/findAll', user.findAllUser)
module.exports = router

以下序号代表代码行号:

  1. 引入controller层
  2. 定义接口类型,地址,调用方法(post, '/findAll'',findAllUser)

app.js

app.js是我们的入口文件及主文件,我们将router里配置的路由在此引入

const
 koaBody = require('koa-body')
 Koa = require('koa'),
 Router = require('koa-router')
 router = new Router()

const user = require('./routers/user');
router.use("/user",user.routes());

这样我们就可以访问:ip:port/user/findAll 接口。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 选择文件夹对话框(web)
Jul 07 Javascript
js 编写规范
Mar 03 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
Apr 25 Javascript
javascript实现日期按月份加减
May 15 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
Mar 13 Javascript
Angular4学习笔记之实现绑定和分包
Aug 01 Javascript
浅谈VUE监听窗口变化事件的问题
Feb 24 Javascript
Vue-cli3项目配置Vue.config.js实战记录
Jul 29 Javascript
详解微信JS-SDK选择图片遇到的坑
Aug 15 Javascript
使用D3.js构建实时图形的示例代码
Aug 28 Javascript
Vue中 key keep-alive的实现原理
Sep 18 Javascript
微信小程序生成二维码的示例代码
Mar 29 Javascript
js实现的格式化数字和金额功能简单示例
Jul 30 #Javascript
JS实现点击发送验证码 xx秒后重新发送功能
Jul 30 #Javascript
微信小程序渲染性能调优小结
Jul 30 #Javascript
vue通过video.js解决m3u8视频播放格式的方法
Jul 30 #Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
Jul 29 #Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
Jul 29 #Javascript
vue前后分离调起微信支付
Jul 29 #Javascript
You might like
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
ThinkPHP分页类使用详解
2014/03/05 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
2015/03/23 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
JS小游戏之宇宙战机源码详解
2014/09/25 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
2017/01/17 Javascript
canvas 绘制圆形时钟
2017/02/22 Javascript
JavaScript之DOM_动力节点Java学院整理
2017/07/03 Javascript
Vue props 单向数据流的实现
2018/11/06 Javascript
JSON的parse()方法介绍
2019/01/31 Javascript
JS模拟浏览器实现全局搜索功能
2019/09/11 Javascript
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
Python学习资料
2007/02/08 Python
在Python中使用SQLite的简单教程
2015/04/29 Python
Python实现类的创建与使用方法示例
2017/07/25 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
Python序列化与反序列化pickle用法实例
2019/11/11 Python
python多线程实现代码(模拟银行服务操作流程)
2020/01/13 Python
python搜索算法原理及实例讲解
2020/11/18 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
印尼披萨外送专家:Domino’s Pizza印尼
2017/12/28 全球购物
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
项目合作计划书
2014/01/09 职场文书
艺术设计专业求职自荐信
2014/05/19 职场文书
广告学专业毕业生自荐信
2014/05/28 职场文书
企业财务总监岗位职责
2015/04/03 职场文书
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js