我在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代码,则以正确的顺序打印。我正和谐的旗帜一起跑。
请告诉我这是什么问题?
答案 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);