Bizar resultaat bij parallelle database queries in nodejs

Pagina: 1
Acties:

  • Bob
  • Registratie: Mei 2005
  • Laatst online: 09:13
Edit: fixed, results is een global in onderstaande code ...


De verwachte output van onderstaand script is:
code:
1
2
3
running queries ---------------
[ { name: 'Company 0' } ]
[ { id: 0, company_id: 0 }, { id: 1, company_id: 0 } ]


Meestal is dit het resultaat, wat volgens mij een bug is:
code:
1
2
3
4
5
running queries ---------------
[ { name: 'Company 0' } ]
[ { name: 'Company 0' },
  { id: 0, company_id: 0 },
  { id: 1, company_id: 0 } ]


Het probleem doet zich nooit voor als ik de lijnen met 'FIX' uncomment. Ik heb nog niet lang ervaring met nodejs, maar ik zie hier na lang staren toch nog steeds niet wat ik fout doe en vermoed dat er een dieper liggend probleem is. Kan iemand dit bevestigen?


JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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 + ';');
    

Acties:
  • +1 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
var results en de global results lijken mij inderdaad iets anders. Daarnaast iets met juiste error handling, logische manieren van functies definiëren (function blablabla() {}), en parameterized queries.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Inderdaad, inline values in een sql query is echt een inmense fout. Nooit meer doen.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • epic007
  • Registratie: Februari 2004
  • Laatst online: 07-10 10:46
regel 25 waar je je result print wordt 2x uitgevoerd (voor beide queries). De inhoud van result is op het moment van printen onvoorspelbaar omdat je niet weet of de andere query al klaar is.

Maak er maar eens console.log('bla'+result) van..

Je moet een manier vinden dat je kan wachten tot beide queries klaar zijn en dan pas printen.

  • Bob
  • Registratie: Mei 2005
  • Laatst online: 09:13
Thx voor de opmerkingen, maar dit was een minimal example dat ik had klaargemaakt speciaal voor de 'bug'. Tegen dat dit projectje klaar is is er hopelijk geen enkele lijn nog hetzelfde :)

En voor wie het niet had gemerkt, mijn edit vermeldt dat het probleem dus result was, die in het voorbeeld een global is en dat helemaal niet mocht zijn.

Acties:
  • 0 Henk 'm!

  • BramV
  • Registratie: Augustus 2007
  • Laatst online: 12:36
Node is async. Zolang je dat concept, soms ook wel de callback hell genoemd, niet begrijpt zal Node voor jou bizar blijven...

Probleem makkelijk op te lossen met een callback, of met een lib zoals async, of maak er een promise van.
Pagina: 1