2011-05-11 41 views
5

首先,我连接数据库,并选择DB:如何使用mysql包得到nodejs的结果?

var defaultOptions = { 
    user: "root", 
    pwd:'admin', 
    db:"britcham_dev_local", 
    server:"local", // Maybe we don't need this variable. 
}; 

var client = new Client(); 
client.user = defaultOptions.user; 
client.password = defaultOptions.pwd; 
client.connect(function (error, results) { 
    // 
}); 
client.query('USE ' + defaultOptions.db, function (error, results) { 
    // 
}); 

其次,我查询与客户端对象:

var self = this; 
var this.users; 
client.query("SELECT * FROM users", function (error, results, fields) { 
    if (error) { 
     // 
    } 
    if (results.length > 0) { 
     self.users = results; 
    } 
}); 

console.log(this.users); 

没什么输出???为什么?

+1

连接和选择数据库时是否收到错误? – yojimbo87 2011-05-11 13:57:19

回答

7

由于Node.js的是非阻塞和异步,那么这段代码:

client.query("SELECT * FROM users", function (error, results, fields) { 
    if (error) { 
     // 
    } 
    if (results.length > 0) { 
     self.users = results; 
    } 
}); 

console.log(this.users); 

从DB数据并不可能尚未加载到用户变量,当你试图把它登录到控制台。您可以检查出来,如果你在查询中做你console.log操作,例如:

client.query("SELECT * FROM users", function (error, results, fields) { 
    if (error) { 
     // 
    } 
    if (results.length > 0) { 
     console.log(results); 
    } 
}); 

要传递的结果到一个变量,当操作完成后你可以用你的客户数据库调用与回调参数的函数并在调用回调时设置变量,例如:

function query(sql, callback) { 
    client.query(sql, function (error, results, fields) { 
     if (error) { 
      // 
     } 
     if (results.length > 0) { 
      callback(results); 
     } 
    }); 
} 

query("SELECT * FROM users", function(results) { 
    self.users = results; 
    console.log(self.users); 
}); 

上面的代码只是一个概念。

+0

一个小小的评论,但你说“来自数据库的数据不大可能加载......”。数据实际上不会在那里,对吧? (因为节点中只有一个执行线程,并且该线程在调用console.log(this.users)之后才能执行回调) – 2011-05-11 16:19:03

+0

@Geoff:从DB中获取数据后,数据将在那里,但是在调用console.log时(在原始代码中)users变量仍为空。例如,如果console.log操作被封装在setTimeout中,则用户应该包含来自数据库的结果。 – yojimbo87 2011-05-11 18:29:34

+0

是的,抱歉,并不意味着永远不会暗示 - 只是在console.log调用之前它永远不会存在。换句话说,它不是一个竞争条件(因为只有一个线程)。 – 2011-05-11 18:46:18

0

建议的答案如何与此不同?

var self = this; 
var this.users; 
client.query("SELECT * FROM users", function (error, results, fields) { 
    if (error) { 
    // 
    } 
    if (results.length > 0) { 
     self.users = results; 
     console.log(this.users); 
    } 
}); 

,它写入到控制台不早于当我们把数据从DB回来,我可能是错的,这是不建议的答案不同。

建议的答案似乎只是增加了另一个功能?