Node.js和node-mysql数据库查询 - 需要同步代码帮助

时间:2011-05-20 01:02:49

标签: mysql node.js synchronous

我正在编写一些非Web应用程序帮助程序,并且遇到了对同步查询调用的需求。

基本上,在循环中我需要检查数据库以查看该值是否存在。如果没有,则插入该值。目前,使用node-mysql,我只能使用它来处理回调。因此,node.js将调用视为异步,并在查询完成之前继续处理我的请求。这是一个大问题,因为最终它可能会插入重复项,因为它们在队列中。

理想的解决方案 - 不起作用。结果实际上是客户端的对象,我无法在其中找到实际结果。但这确实使它同步。

results = client.query('SELECT COUNT(md5) as md5Count FROM table WHERE md5 = "' + md5 + '"')

以下不起作用。 Node.js将其视为异步,而outerResult仍然是客户端的对象。

outerResult = client.query('SELECT COUNT(md5) as md5Count FROM board WHERE md5 = "' + md5 + '"',  function  selectCb(err, results, fields) {console.log(results);});

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

  

基本上,我需要一个循环   检查数据库以查看值   存在。如果没有,则插入   值。目前,用node-mysql我   只能让它与...一起工作   打回来。因此,node.js   将调用视为异步和   继续处理我的请求   查询完成。这是一个大问题   因为最终它可能是   插入重复项,因为它们是   在队列中。

有一个异步解决方案,总有。

基本上你担心可以输入重复的条目。

我认为你有一个循环的数据数组。使用_.uniq或其他一些过滤器解决方案解决了您的问题。

所以你只需致电_.uniq(md5s).forEach(function() { })

答案 1 :(得分:1)

  

基本上,在循环中我需要检查数据库以查看该值是否存在。如果没有,则插入该值。

这是SQL最好的问题。您没有通过反复与数据库通信来解决此问题,您只需在索引值尚不存在的情况下插入SQL即可解决此问题。

INSERT INTO mytable ( name, address ) 
SELECT @name, @address FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM mytable WHERE name = @name, address = @address)

这是一个超级简化的示例,而不是最优化的示例。如果你愿意的话,你可以在这里用数据集做同样的事情,而不是逐个记录。