koa中间件mysql写法_Node.js的Koa框架上手及MySQL操作指南

由 Express 原班人马打造的 koa,致力于成为一个更小、更健壮、更富有表现力的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升常用错误处理效率。Koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。

安装koakoa 依赖支持 generator 的 Node 环境,也就是说,node的版本要在 0.11.9 或者更高,否则将无法执行。

用npm:

或者,选择安装在全局:

Example这是一个koa的简单例子:

// logger

app.use(function *(next){

var start = new Date;

yield next;

var ms = new Date - start;

console.log('%s %s - %s',this.method,this.url,ms);

});

// response

app.use(function *(){

this.body = 'Hello World';

});

app.listen(3000);

与普通的 function 不同,generator functions 以 function* 声明。以这种关键词声明的函数支持 yield。在后面会讲到 yield 的用法和意义。

执行koa执行koa时需要在 —-harmony 模式下运行,为了方便可以将 node 设置为默认启动 harmony 模式的别名:

这样在执行相关js的时候就可以直接使用了。

Cascading这是一个比较抽象的概念。Koa 中间件以一种非常传统的方式级联起来,也就是这里所谓的Cascading。

在以往的 Node 开发中,频繁使用回调不太便于展示复杂的代码逻辑,在 Koa 中,我们可以写出真正具有表现力的中间件。与 Connect 实现中间件的方法相对比,Koa 的做法不是简单的将控制权依次移交给一个又一个的中间件直到程序结束,Koa 执行代码的方式有点像回形针,用户请求通过中间件,遇到 yield next 关键字时,会被传递到下一个符合请求的路由(downstream),在 yield next 捕获不到下一个中间件时,逆序返回继续执行代码(upstream)。

下边这个例子展现了使用这一特殊方法书写的 Hello World 范例:一开始,用户的请求通过 x-response-time 中间件和 logging 中间件,这两个中间件记录了一些请求细节,然后「穿过」 response 中间件一次,最终结束请求,返回 「Hello World」。

当程序运行到 yield next 时,代码流会暂停执行这个中间件的剩余代码,转而切换到下一个被定义的中间件执行代码,这样切换控制权的方式,被称为 downstream,当没有下一个中间件执行 downstream 的时候,代码将会逆序执行。

// x-response-time

app.use(function *(next){

// (1) 进入路由

var start = new Date;

yield next;

// (5) 再次进入 x-response-time 中间件,记录2次通过此中间件「穿越」的时间

var ms = new Date - start;

this.set('X-Response-Time',ms + 'ms');

// (6) 返回 this.body

});

// logger

app.use(function *(next){

// (2) 进入 logger 中间件

var start = new Date;

yield next;

// (4) 再次进入 logger 中间件,记录2次通过此中间件「穿越」的时间

var ms = new Date - start;

console.log('%s %s - %s',ms);

});

// response

app.use(function *(){

// (3) 进入 response 中间件,没有捕获到下一个符合条件的中间件,传递到 upstream

this.body = 'Hello World';

});

app.listen(3000);

在上方的范例代码中,中间件以此被执行的顺序已经在注释中标记出来。你也可以自己尝试运行一下这个范例,并打印记录下各个环节的输出与耗时。

上方的伪代码中标注了中间件的执行顺序,看起来是不是有点像 ruby 执行代码块(block)时 yield 的表现了?也许这能帮助你更好的理解 koa 运作的方式。

MysqL库是以回调形式实现的,而koa中间件要求Promise形式,经过搜索,发现了co-MysqL和MysqL-co,这两个库的思路差不多,MysqL-co封装度更高,并使用速度更快的MysqL2,而co-MysqL更简单,只是将MysqL.query封装成Promise形式。下面是基于co-MysqL的写法

MysqL'),MysqL = require('MysqL');

var options = {

host : 'localhost',port : 3306,database : 'test',user: 'root',password : 'rootroot'

};

var pool = MysqL.createPool(options),p = wrapper(pool);

...

var rows = yield p.query('SELECT 1');

yield this.render('index',{

title: rows[0].fieldName

});

...

})();

实现方法二(promisify-node)找到promisify-node库,可以将库整体转化为Promise形式,示例代码如下:

实现方法三(thunkify、thunkify-wrap)

使用thunkify也能够完成封装,thunkify-wrap是一个增强版的thunkify,不过看说明,这种方法在未来的发展中可能会被淘汰,大概的使用如下:

代码为Promise形式,参考了co-MysqL,并仔细学习了Promise相关知识,完成了已有代码的改造,代码及说明如下:

dbHelper.js

var options = {

'host': config.db_host,'port': config.db_port,'database': config.db_name,'user': config.db_user,'password': config.db_passwd

}

var MysqL = require('MysqL');

var pool = MysqL.createPool(options);

//内部对MysqL的封装,执行sql语句

function execQuery(sql,values,callback) {

var errinfo;

pool.getConnection(function(err,connection) {

if (err) {

errinfo = 'DB-获取数据库连接异常!';

throw errinfo;

} else {

var querys = connection.query(sql,function(err,rows) {

release(connection);

if (err) {

errinfo = 'DB-sql语句执行错误:' + err;

callback(err);

} else {

callback(null,rows); //注意:第一个参数必须为null

}

});

}

});

}

function release(connection) {

try {

connection.release(function(error) {

if (error) {

console.log('DB-关闭数据库连接异常!');

}

});

} catch (err) {}

}

//对外接口返回Promise函数形式

exports.getById = function(tablename,id){

return new Promise(function(resolve,reject){

var values = {id:id};

var sql = 'select * from ?? where ?';

execQuery(sql,[tablename,values],rows){

if(err){

reject(err);

}else{

resolve(rows);

}

})

});

}

routes/index.js

var db = require("../dbHelper");

...

var rows = yield db.getById('tableName',{

title: rows[0].fieldName

});

...

代码

请参考这个项目中的数据库操作部分,项目处于持续开发中,数据库示例部分取自该项目。

https://github.com/zhoutk/koadmin.git

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值