Node.js和sqlite:在回调中同步

时间:2013-12-23 02:18:30

标签: javascript sql node.js sqlite

我正在尝试编写以下逻辑:

if account in the DB,
  then update fields
  else insert new row with data.

这是一个原子操作,所以我把它作为SQL事务(DB是sqlite3):

BEGIN;
SELECT rowid FROM Account WHERE email=?;
-- Depending on SELECT's result, run INSERT or UPDATE:
INSERT INTO Accounts(email, name, phone) VALUES (?, ?, ?);
UPDATE Accounts SET name=? phone=? WHERE rowid=?;
COMMIT;

我决定在insert的回调中运行updateselect。但到目前为止,SQL语句不再同步!在同步块结束和回调执行之间,可以执行任意SQL语句。

db.synchronized(function() {
  db.run('BEGIN;');
  db.get('SELECT ...;', [...], function(err, row) {
    // Before this callback is getting executed, there are no sync!
    // Assume no errors
    function commit() {
      // Before this callback is getting executed, there are no sync too!
      db.run('COMMIT;');
      // Use this.lastID
    }
    if (row) {
      db.run('INSERT ...', [...], commit);
    } else {
      db.run('UPDATE ...', [...], commit);
    }
  });
});

我该如何解决这个问题?

0 个答案:

没有答案