我尝试使用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);
没有执行。
答案 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])