2015-06-03 3 views
0

У меня есть следующий код в koa.jsКак работает koa.js?

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); 

Переменная печатает ROWCOUNT не определено в браузере. Но внутри connection.query он печатает все строки. Кроме того, выход в консоли

PS J:\proj\pg> node --harmony .\app.js 
A 
B 
C 
D 
E 
The solution is: [ { categoryno: 0, categoryname: 'PESTICIDES', categorystatus: 0 }, 
    { categoryno: 1, categoryname: 'SEEDS ', categorystatus: 0 }, 
    { categoryno: 2, categoryname: 'FERTILIZERS', categorystatus: 0 }, 
    { categoryno: 3, categoryname: 'OTHERS', categorystatus: 0 } ] 
The rowCount is: [ { categoryno: 0, categoryname: 'PESTICIDES', categorystatus: 0 }, 
    { categoryno: 1, categoryname: 'SEEDS ', categorystatus: 0 }, 
    { categoryno: 2, categoryname: 'FERTILIZERS', categorystatus: 0 }, 
    { categoryno: 3, categoryname: 'OTHERS', categorystatus: 0 } ] 

В соответствии, например, в Коа он должен печатать строки, а затем только D и Е, но БД строки печатаются после того, как D и E.

Если db удаляется, а затем печатает в правильном порядке. Я бегу с флагом гармонии.

Пожалуйста, расскажите мне, в чем проблема?

ответ

2

Выполнение запроса асинхронно с обратным вызовом, что не так, как вы хотели бы сделать это в koa.

Вы хотите либо использовать библиотеку, которая поддерживает обещания или thunks, либо вы можете обернуть библиотеку, которую вы используете, чтобы она вернула обещание или удар.

Затем вы получите запрос, который приостанавливает выполнение функции до тех пор, пока результат не будет возвращен, затем функция продолжит работу с того места, где она была приостановлена, с результатом запроса.

Для примера следует рассмотреть следующую библиотеку:

Я не использовал его, поэтому я не могу поручиться за это, но это выглядит разумным на первый взгляд.

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); 

 Смежные вопросы

  • Нет связанных вопросов^_^