koa+orm2

koa是由 Express 原班人马打造的新的web框架。套用其官方的说法:Koa 应用是一个包含一系列中间件 generator 函数的对象。 这些中间件函数基于 request 请求以一个类似于栈的结构组成并依次执行。

koa的中间件系统原理:

  Koa的精妙之处就在于其基于promise的中间件系统的实现,避免了免除重复繁琐的回调函数嵌套。Koa的中间件是一系列generator函数的对象,执行起来有点类似于栈的结构,依次执行。从网上找到一张图可以比较形象的说明koa的中间件是如何工作的:

  每个中间件都是generator函数,当一个请求过来的时候,会依次经过各个中间件进行处理,当遇到await next()时,Koa 暂停了该中间件,执行下一个中间件。直到某个中间件不调用下个中间件,即没有处理await next()。则kao会逆序向上依次执行被暂停的中间件的剩余部分逻辑。

  代码实例如下:

 1 const Koa = require('koa');
2 const app = new Koa();
3 /**
4 * 请求依次进入下面三个中间件
5 * */
6 // x-response-time
7 app.use(async function (ctx, next) {
8 /**
9 * 首先获得start时间
10 * */
11 const start = new Date();
12 /**
13 * 遇到next中间件的调用,则暂停该中间件。执行下一个即logger
14 * */
15 await next();
16 /**
17 * logger,完全执行之后,继续下面的部分
18 * */
19 const ms = new Date() - start;
20 console.log('X-Response-Time', `${ms}ms`);
21 /**
22 * 至此,整个请求执行结束。
23 * */
24
25 });
26 // logger
27 app.use(async function (ctx, next) {
28 const start = new Date();
29 /**
30 * 获得start之后,暂停。执行response
31 * */
32 await next();
33 /**
34 * response执行之后,获得执行权继续执行下面逻辑。
35 * */
36 const ms = new Date() - start;
37 console.log(`${ctx.method} ${ctx.url} - ${ms}`);
38 /**
39 * 执行完毕,将执行权交个上个中间件,即x-response-time
40 * */
41 };
42 //response
43 app.use(async function(ctx,next){
44 /**
45 * 执行之后,没有下一个中间件的调用,即 await next();
46 * 则向上执行logger,余下的部分
47 * */
48 ctx.body = 'Hello World';
49 })
50
51 app.listen(3000);

  上面代码执行的顺序为:

  1、请求开始时,请求先经过 x-response-time, 当遇到await next()时,暂停当前调用下个中间件。

  2、logger 中间件执行当遇到await next()时,暂停当前调用下个中间件。

  3、reponse 中间件执行,执行完成,将控制权交给上个中间件即logger。

  4、logger执行await next()后面的逻辑,打印相应信息。完成之后,将控制权交给上个中间件即 x-response-time。

  5、 x-response-time执行剩下的部分,打印相应信息。

  当我们使用koa的时候,应该通过use添加一个中间件,处理相关的任务。注意该中间件也应该按照koa的要求为generator函数的形式。

kao+node-orm2需要注意的部分:

   作为Node.js 的ORM框架orm2也是比较流行的。作为后端开发的时候,与express框架的结合也是比较合适的。如果想要配合koa的使用就要注意一下。

  前面提到的koa的中间件是要求generator函数,起码基于promise。而orm2数据库连接则是原本的回调方式进行的。

  

var orm = require('orm');

orm.connect('mysql://root:password@localhost/test', function(err, db) {
if (err) return console.error('Connection error: ' + err); // connected
// ...
});

  这样两者就不能很好的合并使用了。如果想要同时使用的话,解决方法也是比较鲜明的,如何让orm2处理数据库连接等api以promise的方式暴露出来。

  解决方式还是比较多的,比较方便的是,使用对orm2进行了promise包装的qOrm来代替直接引用orm。然后通过app.use引入即可。这样的话数据库连接中间件的代码可以如下:

 1 var orm = require('orm');
2 var qOrm = require('q-orm');
3 var dbSet = require('../../config/setting');
4
5 var connection = null;
6
7 function setup(db) {
8 require('../models/demoModel')(qOrm, db);
9 require('../models/personModel')(qOrm, db);
10 require('../models/questionModel')(qOrm, db);
11 }
12 module.exports = async function (ctx,next) {
13 if (connection){
14 await next();
15 } else{
16 await qOrm.qConnect(dbSet).then(function(db){
17 connection = db;
18 setup(db);
19 ctx.req.models = db.models;
20 ctx.req.db = db;
21 });
22 await next();
23 }
24 };

  使用koa一定要理解koa的基本思想,即通过中间件系统依次处理不同任务。这就要求各部分必须满足koa中间件的要求:中间件为ggenerator,而传统的回调方式进行处理的方法不会返回promise的对象给koa来判断当前处理次序。因此会报Module not found的错,并且提示语也不多。第一次遇到的时候用了好久才找到原因所在,希望其他小伙伴引以为戒,既然使用某个框架一定要遵循其要求。

  

koa+orm2的更多相关文章

  1. koa中间件系统原理及koa+orm2实践。

    koa是由 Express 原班人马打造的新的web框架.套用其官方的说法:Koa 应用是一个包含一系列中间件 generator 函数的对象. 这些中间件函数基于 request 请求以一个类似于栈 ...

  2. Node.js实现RESTful api,express or koa?

    文章导读: 一.what's RESTful API 二.Express RESTful API 三.KOA RESTful API 四.express还是koa? 五.参考资料 一.what's R ...

  3. koa简介

    资料来源:http://javascript.ruanyifeng.com/nodejs/koa.htmlhttp://koa.bootcss.com/ 以下内容为摘抄,纯属做笔记加深印象.勿喷. 使 ...

  4. koa框架异步返回值的操作(co,koa-compose)

    最近在做demo的时候使用了koa框架,自己做了一个静态服务器,首先判断访问文件是否存在,在回调函数中设置了this.body,run之后,各种404,花了N长的时间把koa-compose和co模块 ...

  5. koa知识点

    1. Koa 不支持 直接调用底层 res 进行响应处理.请避免使用以下 node 属性: res.statusCode res.writeHead() res.write() res.end() 2 ...

  6. Koa框架实践与中间件原理剖析

     最近尝试用了一下Koa,并在此记录一下使用心得. 注意:本文是以读者已经了解Generator和Promise为前提在写的,因为单单Generator和Promise都能够写一篇博文来讲解介绍了,所 ...

  7. [Node.js] ECMAScript 6中的生成器及koa小析

    原文地址:http://www.moye.me/2014/11/10/ecmascript-6-generator/ 引子 老听人说 koa大法好,这两天我也赶了把时髦:用 n 安上了node 0.1 ...

  8. Koa – 更加强大的下一代 Node.js Web 框架

    Koa 是 Express 的开发团队设计的下一代 Web 框架,其目的是为 Web 应用程序提供更小,更具表现力,更坚实的基础.Koa 没有核捆绑任何中间件,并提供了一​​套优雅的方法,使服务器端开 ...

  9. koa 笔记 运行错误

    按照 演示的代码 直接运行会出错,大家需要调整方式. http://koajs.cn/ 要安装以下 $ npm install -g n$ n 0.11.12$ node --harmony my-k ...

随机推荐

  1. 【题解】 bzoj4033: [HAOI2015]树上染色* (动态规划)

    bzoj4033,懒得复制,戳我戳我 Solution: 定义状态\(dp[i][j]\)表示\(i\)号节点为根节点的子树里面有\(j\)个黑色节点时最大的贡献值 然后我们要知道的就是子节点到根节点 ...

  2. Winform Treeview 排序及图标处理

      一.排序 1. 继承 IComparer 2.  treeView1.TreeViewNodeSorter = this; 3. 实现IComparer public int Compare(ob ...

  3. 【bzoj3237】 Ahoi2013—连通图

    http://www.lydsy.com/JudgeOnline/problem.php?id=3237 (题目链接) 题意 给出一个无向图,$Q$组询问,每次询问将原图断掉$C$条边后是否还连通. ...

  4. Libre 6004 「网络流 24 题」圆桌聚餐(网络流,最大流)

    Libre 6004 「网络流 24 题」圆桌聚餐(网络流,最大流) Description 假设有来自n个不同单位的代表参加一次国际会议.每个单位的代表数分别为 ri.会议餐厅共有m张餐桌,每张餐桌 ...

  5. chessboard

    题意:n*n的矩阵,m次赋值一个子矩阵为c,最后输出答案. n<=1e3 m<=1e5 解:倒序处理. 拆行处理. 每行内并查集维护未被赋值的地方. 这样每个地方最多被赋值一次,每次修改要 ...

  6. HDFS之append数据到已存在文件中

    遇到一个问题,想往已存在的hdfs文件中直接添加数据,默认的话应该是被拒绝的.查看了一些资料,可以这样操作: 在pdfs-site.xml中添加append支持: <property> & ...

  7. [Leetcode]找到出现不同次数的数字(通用解法)

    今天在leetcode上遇到了 137. Single Number II 这道题: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素.(Give ...

  8. Python案例

    我感觉好方啊,Python和C语言不一样啊....写了几个例子... 变量    变量的占位后面没有逗号啊啊啊啊 name='张泉' age=22 tel=110 print ('姓名:%s,年龄:% ...

  9. JAVA-Servlet内容

    Servlet重定向 HttpServletResponse接口的sendRedirect()方法可以用于将响应重定向到另一个资源,资源可能是servlet,jsp或html文件. 它接受相对和绝对U ...

  10. OpenGL ES 2.0 Shader 调试新思路(一): 改变提问方式

    OpenGL ES 2.0 Shader 调试新思路(一): 改变提问方式 --是什么(答案是具体值) VS 是不是(答案是布尔值) 目录 背景介绍 问题描述 Codea 是 iPad 上的一款很方便 ...