node-postgres n’insère pas de données, mais ne génère pas d’erreurs

J’utilise le module node-postgres pour node.js et j’ai un problème d’insertion de données.

La fonction:

function addItems(listId, listItems, handle) { if (!listItems) { handle(listId); return; } var client = dbConnector.getClient(), important, dateArray, dateSsortingng, i, prepStatement; client.connect(); for (i in listItems) { console.log(listItems[i]); dateArray = listItems[i].itemdate.split('-'); dateSsortingng = 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, dateSsortingng, 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); } 

Aucune nouvelle donnée n’apparaît dans la firebase database. Les query.on('error') et query.on('end') ne sont jamais déclenchés. À bien y penser, je commence à me demander si la requête est même déclenchée (mais je ne vois pas pourquoi elle ne devrait pas l’être).

Le seul journal que je reçois est:

 { 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 

Alors, comment dois-je procéder pour déboguer ceci?

Votre appelant client.end () avant que vos requêtes puissent s’exécuter. node-postgres ne générera pas d’erreur “non connecté”, car il est conçu pour mettre les requêtes en queue jusqu’à ce que la connexion soit prête. https://github.com/brianc/node-postgres/wiki/Client#method-connect

Essaye ça:

 function addItems(listId, listItems, handle) { if (!listItems) { handle(listId); return; } var client = dbConnector.getClient(), important, dateArray, dateSsortingng, i, prepStatement, queryCount = 0; client.connect(); for (i in listItems) { console.log(listItems[i]); dateArray = listItems[i].itemdate.split('-'); dateSsortingng = 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, dateSsortingng, 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); } }); } } 

Tout ce qui précède ne fait que garder trace du nombre de requêtes que vous avez émises et de leur fin, appelez client.end () et handle (listId);

Cela peut être fastidieux et sujet à des erreurs, il existe donc quelques bibliothèques pour faciliter le stream asyc. Mon préféré est async, cela fonctionne dans le navigateur et dans le noeud. https://github.com/caolan/async

En utilisant async, je réécrirais le code comme suit:

 function addItems(listId, listItems, handle) { if (!listItems) { handle(listId); return; } var client = dbConnector.getClient(), important, dateArray, dateSsortingng, i, prepStatement; client.connect(); async.forEach( listItems, // called for each listItems function(listItem, callback){ console.log(listItem); dateArray = listItem.itemdate.split('-'); dateSsortingng = 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, dateSsortingng, 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); } ); }; 

Voir aussi async.forEachSeries, mais je ne pense pas que ce soit nécessaire dans ce cas car le client node-postgres va de toute façon exécuter les requêtes en série.