当产生一个函数(yield client.query)时,为什么函数的代码不执行?

时间:2016-01-05 10:27:53

标签: mysql node.js koa

我尝试使用nodejs编写一些代码来读取mysql,我的代码如下:

exports.selectport = function*(projectname){
    var strsql = "SELECT DISTINCT portname FROM invoketable where projectname = '"+projectname+"'";
    var rest;
    yield 1;
    yield client.query(strsql, function(err, results) {
        if(err) {
           console.log(err);
           return err;
        }
        rest = results[0].portname;
        console.log(rest);
        return rest;
    });
    yield rest;
}

我用代码来调用函数:

var gen = mysqlinsertp.selectport(dataproject);
var ret = gen.next(); 
console.log(ret.value); // 1
console.log(ret.done); // false
var ret2 = gen.next();
console.log(ret2.value); // Query{...}
console.log(ret2.done); // false
var ret3 = gen.next(); 
console.log(ret3.value); // undefined
console.log(ret3.done); // false
var ret4 = gen.next(); 
console.log(ret4.value); // undefined
console.log(ret4.done); // true

我想知道为什么rest = results[0].portname; console.log(rest);没有执行。

1 个答案:

答案 0 :(得分:1)

看起来你正在混合发电机和回调。 如果这样,你只会使用yield:client.query(sql)返回一个promise或thunk,在这种情况下,你不会像上面所示那样使用回调。

如果你使用的库没有返回承诺或thunk,你需要:

// yieldable 
let results = yield client.query(sql);
// straight callback
client.query(sql, function(err, results){...});
  • 选择支持承诺//可屈服的
  • 的库
  • 围绕回调编写自己的承诺包装//易于查找
  • 只使用回调而不是试图产生//直接回调

另外你的sql容易受到sql注入攻击。如果用户指定项目名称,他们可以发送项目名称,如junk'; DROP TABLE users;,在这种情况下,您将丢失用户表或其他表... 您应该转义参数或参数化查询connection.query('SELECT DISTINCT portname FROM invoketable where projectname ?', [project])