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 相关文章推荐
jQuery 事件队列调整方法
Sep 18 Javascript
从面试题学习Javascript 面向对象(创建对象)
Mar 30 Javascript
node.js中的fs.stat方法使用说明
Dec 16 Javascript
AngularJS控制器之间的数据共享及通信详解
Aug 01 Javascript
js判断浏览器是否支持严格模式的方法
Oct 04 Javascript
微信小程序 animation API详解及实例代码
Oct 08 Javascript
jQuery 遍历map()方法详解
Nov 04 Javascript
JavaScript之RegExp_动力节点Java学院整理
Jun 29 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
Sep 26 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
Dec 07 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 Javascript
react antd实现动态增减表单
Jun 03 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
造势之举?韩国总统候选人发布《星际争霸》地图
2017/04/22 星际争霸
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
php 动态多文件上传
2009/01/18 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
javascript 检测浏览器类型和版本的代码
2009/09/15 Javascript
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
jQuery.event兼容各浏览器的event详细解析
2013/12/18 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
2014/05/08 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
简单谈谈原生js的math对象
2017/06/27 Javascript
vue源码解析之事件机制原理
2018/04/21 Javascript
进一步理解Python中的函数编程
2015/04/13 Python
最基础的Python的socket编程入门教程
2015/04/23 Python
Python中字符串对齐方法介绍
2015/05/21 Python
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
python将文本分每两行一组并保存到文件
2018/03/19 Python
python实现简单淘宝秒杀功能
2018/05/03 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
2019/04/15 Python
Python 取numpy数组的某几行某几列方法
2019/10/24 Python
python实现按首字母分类查找功能
2019/10/31 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
CSS3 media queries + jQuery实现响应式导航
2016/09/30 HTML / CSS
HTML5实现可缩放时钟代码
2017/08/28 HTML / CSS
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
来自美国主售篮球鞋的零售商店:KICKSUSA
2017/11/28 全球购物
Linux开机引导的步骤是什么
2014/02/26 面试题
大学生通用个人的自我评价
2014/02/10 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
健康教育主题班会
2015/08/14 职场文书
golang中字符串MD5生成方式总结
2021/07/04 Golang