2012-05-08 24 views
3

node.jsにnode-postgresモジュールを使用していますが、データの挿入に問題があります。node-postgresはデータを挿入しませんが、エラーは発生しません

機能:

function addItems(listId, listItems, handle) { 
    if (!listItems) { 
     handle(listId); 
     return; 
    } 
    var client = dbConnector.getClient(), 
     important, 
     dateArray, 
     dateString, 
     i, 
     prepStatement; 
    client.connect(); 
    for (i in listItems) { 
     console.log(listItems[i]); 
     dateArray = listItems[i].itemdate.split('-'); 
     dateString = dateArray[1] + '-' + dateArray[0] + '-' + dateArray[2]; 
     if (listItems[i].important) { 
      important = 'true'; 
     } else { 
      important = 'false'; 
     } 
     prepStatement = { 
      name: 'insert task', 
      text: 'INSERT INTO listitem (todolist_id, name, deadline, description, important, done, created) VALUES ($1, $2, $3, $4, $5, $6, now()) RETURNING listitem_id', 
      values: [ listId, listItems[i].itemname, dateString, listItems[i].itemdesc, important, listItems[i].done ] 
     }; 
     var query = client.query(prepStatement); 
     console.log("Adding item " + i); 
     query.on('error', function(error) { 
      console.log(error); 
     }); 
     query.on('end', function(result) { 
      console.log("Query ended"); 
      if (result) { 
       console.log("Added listitem no " + result.rows[0].listitem_id); 
      } 
     }); 
    } 
    client.end(); 
    handle(listId); 
} 

新しいデータがデータベースに表示されます。 query.on('error')query.on('end')イベントは発生しません。それを考えてみると、クエリがトリガされたかどうか疑問に思っています。私が手

唯一のログは次のとおりです。

{ itemname: 'Task 1', 
    itemdate: '08-05-2012', 
    important: 'on', 
    itemdesc: 'A task', 
    done: 'false' } 
Adding item 0 
{ itemname: 'Task 2', 
    itemdate: '22-05-2012', 
    important: 'on', 
    itemdesc: 'Another one', 
    done: 'false' } 
Adding item 1 

それでは、どのように私はこれをデバッグする際に進むべき?

答えて

5

クエリが実行される前に、呼び出し元のclient.end()が実行されます。 node-postgresは、接続が準備完了するまでクエリをキューに入れるように設計されているため、「接続されていない」エラーをスローしません。 https://github.com/brianc/node-postgres/wiki/Client#method-connect

これを試してみてください:

function addItems(listId, listItems, handle) { 
    if (!listItems) { 
     handle(listId); 
     return; 
    } 
    var client = dbConnector.getClient(), 
     important, 
     dateArray, 
     dateString, 
     i, 
     prepStatement, 
     queryCount = 0; 
    client.connect(); 
    for (i in listItems) { 
     console.log(listItems[i]); 
     dateArray = listItems[i].itemdate.split('-'); 
     dateString = dateArray[1] + '-' + dateArray[0] + '-' + dateArray[2]; 
     if (listItems[i].important) { 
      important = 'true'; 
     } else { 
      important = 'false'; 
     } 
     prepStatement = { 
      name: 'insert task', 
      text: 'INSERT INTO listitem (todolist_id, name, deadline, description, important, done, created) VALUES ($1, $2, $3, $4, $5, $6, now()) RETURNING listitem_id', 
      values: [ listId, listItems[i].itemname, dateString, listItems[i].itemdesc, important, listItems[i].done ] 
     }; 
     var query = client.query(prepStatement); 
     queryCount++; 
     console.log("Adding item " + i); 
     query.on('error', function(error) { 
      console.log(error); 
     }); 
     query.on('end', function(result) { 
      queryCount--; 
      console.log("Query ended"); 
      if (result) { 
       console.log("Added listitem no " + result.rows[0].listitem_id); 
      } 
      if (queryCount === 0) { 
      client.end(); 
      handle(listId); 
      } 
     }); 
    } 
} 

上記のすべて(listIdを)あなたが発行されてきたクエリの数を追跡し、それらがすべて終了したとき、その後、client.end()を呼び出し、ハンドルされてい;

これは面倒でエラーが発生する可能性があるため、asycフローを簡単にするライブラリがいくつか存在します。私のお気に入りは非同期で、ブラウザとノードで動作します。

function addItems(listId, listItems, handle) { 
    if (!listItems) { 
     handle(listId); 
     return; 
    } 
    var client = dbConnector.getClient(), 
     important, 
     dateArray, 
     dateString, 
     i, 
     prepStatement; 
    client.connect(); 

    async.forEach(
     listItems, 
     // called for each listItems 
     function(listItem, callback){ 
     console.log(listItem); 
     dateArray = listItem.itemdate.split('-'); 
     dateString = dateArray[1] + '-' + dateArray[0] + '-' + dateArray[2]; 
     if (listItem.important) { 
      important = 'true'; 
     } else { 
      important = 'false'; 
     } 
     prepStatement = { 
      name: 'insert task', 
      text: 'INSERT INTO listitem (todolist_id, name, deadline, description, important, done, created) VALUES ($1, $2, $3, $4, $5, $6, now()) RETURNING listitem_id', 
      values: [ listId, listItem.itemname, dateString, listItem.itemdesc, important, listItem.done ] 
     }; 
     var query = client.query(prepStatement); 
     //console.log("Adding item " + i); 
     query.on('error', function(error) { 
      console.log(error); 
      callback(error), 
     }); 
     query.on('end', function(result) { 
      console.log("Query ended"); 
      if (result) { 
       console.log("Added listitem no " + result.rows[0].listitem_id); 
      } 
      callback(null,result); 
     }); 
     }, 
     // called after iterator function 
     function(err) { 
     if (err) return; // could use this as an err handler for all queries    
     client.end(); 
     handle(listId); 
     } 
    ); 
}; 

もasync.forEachSeriesを参照してください、私はノードPostgresのクライアントを実行しようとしているので、それはこの場合には必要だとは思わない:として非同期を使用してhttps://github.com/caolan/async

、私はコードを書き換えるでしょうクエリは連続しています。

+0

私はasyncモジュールを使いました。うまく動作する(奇妙なことは、それが質問に実装されたようにある時点で正常に動作したということです)。 – j0ntech

関連する問題