koa.js下一步如何产生?

时间:2015-06-03 17:52:57

标签: javascript koa

我在koa.js中有以下代码

vabsdiff4

rowCount变量在浏览器中打印undefined。但是在connection.query里面它会打印所有的行。 控制台中的输出也是

var koa = require('koa');
var app = koa();
var mysql = require('mysql');

app.use(function *(next) {
  console.log('A');
  yield next;
  console.log('E');
});

app.use(function *(next) {
  console.log('B');
  yield next;
  console.log('D');
});

app.use(function *(next) {
var rowCount;
  console.log('C');
  var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : 'pass',
    database : 'db1'
  });

  connection.connect();

  connection.query('SELECT * from itemcategory', function(err, rows, fields) {
    if (err) throw err;

    console.log('The solution is: ', rows);
    rowCount = rows;
    console.log('The rowCount is: ', rowCount);
  });


  this.body = "we are good!.." + rowCount ;
  connection.end();

});

app.listen(3000);

根据Koa中的示例,它应该打印行,然后只打印D和E,但是在D和E之后打印db行。

如果删除了db代码,则以正确的顺序打印。我正和谐的旗帜一起跑。

请告诉我这是什么问题?

1 个答案:

答案 0 :(得分:2)

您使用回调异步运行查询,这不是您希望在koa中执行此操作的方式。

您希望使用支持promises或thunks的库,或者您可以使用它来包装您的库,以便它返回promise或thunk。

然后你会产生一个查询,它暂停函数的执行直到返回一个结果,然后函数从暂停的地方继续,查询结果可用。

对于您的示例,您应该考虑以下库:

我还没有使用它,所以我无法保证,但它看起来很合理。

https://github.com/sidorares/mysql-co

这个库是可以兼容的mysql库的包装器。

所以你的代码看起来像这样:

var koa = require('koa');
var app = koa();
var mysql = require('mysql-co');

app.use(function *(next) {
  console.log('A');
  yield next;
  console.log('E');
});

app.use(function *(next) {
  console.log('B');
  yield next;
  console.log('D');
});

app.use(function *(next) {
var rowCount;
  console.log('C');
  try{
    var connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'root',
      password : 'pass',
      database : 'db1'
    });

    var result = yield connection.query('SELECT * from itemcategory');
    console.log(result);

    this.body = "we are good!.." + result.rows ;
    connection.end();
  }
  catch(err){
    // handle any errors here
  }
});

app.listen(3000);