【问题标题】:node-postgres will not insert data, but doesn't throw errors eithernode-postgres 不会插入数据,但也不会抛出错误
【发布时间】:2012-05-17 03:27:05
【问题描述】:

我正在为 node.js 使用 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

那么我应该如何进行调试呢?

【问题讨论】:

    标签: node.js node-postgres


    【解决方案1】:

    在执行查询之前调用 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);
               }
            });
        }
    }
    

    以上所有操作都是跟踪您发出的查询数量以及它们何时全部结束,然后调用 client.end() 和 handle(listId);

    这可能很乏味且容易出错,因此存在一些库来简化 asyc 流程。我最喜欢的是异步,它可以在浏览器和节点中运行。 https://github.com/caolan/async

    使用异步,我将代码重写为:

    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,但我认为在这种情况下不需要它,因为 node-postgres 客户端无论如何都会按顺序运行查询。

    【讨论】:

    • 我选择了异步模块。工作正常(奇怪的是它在问题中实施时在某些时候工作正常)。
    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 2015-01-04
    • 1970-01-01
    • 2019-12-06
    • 2020-01-15
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多