node-postgres no insertará datos, pero tampoco arrojará errores

Estoy usando el módulo node-postgres para node.js y tengo un problema al insertar datos.

La función:

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); } 

No aparecen nuevos datos en la base de datos. Los query.on('error') y query.on('end') nunca se query.on('end') . Ahora que lo pienso, estoy empezando a dudar si la consulta se ha activado (aunque no puedo ver por qué no debería).

El único registro que obtengo es:

 { 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 

Entonces, ¿cómo debo proceder en la depuración de esto?

Su llamada client.end () antes de que sus consultas puedan ejecutarse. node-postgres no generará un error “no conectado”, ya que está diseñado para poner en cola las consultas hasta que la conexión esté lista. https://github.com/brianc/node-postgres/wiki/Client#method-connect

Prueba esto:

 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); } }); } } 

Todo lo anterior es hacer un seguimiento de la cantidad de consultas que ha realizado y cuando todas han finalizado, a continuación, llama a client.end () y manejar (listId);

Esto puede ser tedioso y propenso a errores, por lo tanto, existen algunas bibliotecas para facilitar el flujo de información. Mi favorito es async, funciona en el navegador y en el nodo. https://github.com/caolan/async

Usando async, reescribiría el código como:

 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); } ); }; 

vea también async.forEachSeries, pero no creo que sea necesario en este caso porque el cliente node-postgres ejecutará las consultas en serie de todos modos.