通过node.js并发postgresql访问的行为不一致

时间:2015-09-16 19:22:35

标签: node.js postgresql

node.js和postgresql的一个相当简单的用例让我困惑。

此代码执行的第一个查询的结果似乎会延迟并错误地包含在第二个查询的结果数组中。

预期产出:

running queries ---------------
[ { name: 'Company 0' } ]
[ { id: 0, company_id: 0 }, { id: 1, company_id: 0 } ]

常用输出:

running queries ---------------
[ { name: 'Company 0' } ]
[ { name: 'Company 0' },
  { id: 0, company_id: 0 },
  { id: 1, company_id: 0 } ]

偶尔我会得到正确的结果。在代码下方,包含一个“修复”,确保我始终得到正确的结果:

var pg = require('pg');
var connectionString = require('./dbconfig.js');



var doQuery = function(queryString) {

    // Get a Postgres client from the connection pool
    pg.connect(connectionString, function(err, client, done) {

        results = [];
//         results.push(queryString); // PART OF 'FIX'

        var query = client.query(queryString);

        // Stream results back one row at a time
        query.on('row', function(row) {
            results.push(row);
        });

        // After all data is returned, close connection and return results
        query.on('end', function() {
            client.end();
//             results.splice(0, 1);  // PART OF 'FIX'
            console.log(results);
        });

        // Handle Errors
        if(err) {
        console.log(err);
        }

    });
};

var company_id = 0;

console.log('running queries ---------------');

doQuery('SELECT companies.name  FROM companies WHERE companies.id = '+company_id+';');

doQuery('SELECT * FROM users WHERE users.company_id = ' + company_id + ';');

如果有人有兴趣尝试重现这一点(假设我不是一个愚蠢的编码错误),我很乐意提供剩下的代码。

1 个答案:

答案 0 :(得分:-2)

JavaScript是一种糟糕的语言(请参阅我对解决方案的评论)。