2016-08-18 3 views
0

Ich versuche, herauszufinden, warum eine meiner Anfragen nicht den Wert aus einer Abfrage zurückgeben ... mein Code sieht wie folgt aus:Javascript Funktion liefert kein Abfrageergebnis

var client = new pg.Client(conString); 
client.connect(); 

var query = client.query("SELECT count(*) as count FROM sat_scores") 

// Don't use demo key in production. Get a key from https://api.nasa.gov/index.html#apply-for-an-api-key 

function getNEO(callback) { 
    var data = ''; 
    query.on('rows', function(rows) { 
     console.log("Row count is: %s", rows[0].count) 
     data += rows[0].count; 
    }); 
    query.on('end', function() { 
     callback(data); 
    }); 
} 

mit, dass, getNEO gibt eine leere ... aber wenn ich var data = '4' gesetzt, dann getNEO gibt 4 zurück .... die Abfrage sollte 128 zurück, aber es gibt nur eine leere ...

+0

wie das 'data' Ereignis Scheint könnte ausgelöst werden? Wird die 'console.log' in Ihrer Konsole angezeigt? –

+0

@FelixKling, scheint wie 'query.on ('data', ...' wird nicht ausgelöst ... änderte die ''data'' zu'' rows' auch, aber das hat auch nicht funktioniert .. – user2061886

+0

Also das ist der Grund, warum der leere Wert übergeben wird. Jetzt müssen Sie herausfinden, wie Sie die Daten tatsächlich erhalten. –

Antwort

1

Zunächst einmal getNEO() nicht Rückkehr alles - ich gehe davon aus, dass Sie getNEO() genau einmal für Ihre query anrufen, a nd einen Callback übergeben, um die Daten zu verarbeiten, und dieser Callback erhält nicht die richtigen Daten?

Meine typische Empfehlung für die Fehlerbehebung Dinge wie diese ist Ihr Code zu vereinfachen, und versuchen, wirklich nah an jedem Beispielcode zu erhalten gegeben (for instance):

var client = new pg.Client(conString); 
// define your callback here, in theory 
client.connect(function (err) { 
    if (err) throw err; 

    var query = client.query("SELECT count(*) as count FROM sat_scores"), 
     function(err, result) { 
      if (err) throw err; 

      console.log(result.rows.length); 
     } 
    ); 
}); 

... Ich mache ein paar Dinge hier finden Sie beachten wollen:

  1. Es sieht aus wie die client.connect() Methode asynchron ist - man kann nicht einfach anschließen und dann Ihre Frage gehen laufen, müssen Sie warten, bis die Verbindung hergestellt ist, daher der Rückruf. Beim Durchsehen des Codes sieht es so aus, als könnte es ein connect-Ereignis ausgeben, wenn es bereit ist, Abfragen zu senden, so dass Sie keinen Callback für die connect()-Methode direkt verwenden müssen.
  2. Ich sehe kein data Ereignis in the documentation for the query object noch sehe ich eins im Code. Sie könnten das Ereignis row verwenden, oder Sie könnten einen Rückruf direkt auf der Abfrage verwenden, wie im Beispiel auf der Hauptseite - das habe ich hier aus Gründen der Einfachheit getan.
  3. Ich sehe die count Eigenschaft nicht Sie verwenden, und row[0] wird nur das erste Ergebnis zu gehen - ich glaube, Sie die length Eigenschaft wollen im großen und ganzen rows Array, wenn Sie für die Anzahl der Zeilen suchen zurück .

Ich weiß nicht, ob Sie einen guten Grund haben, die getNEO() Funktion zu verwenden, wie direkt in prozedural zu setzen Sie den Code dagegen, aber ich denke, Sie eine bessere Annäherung bekommen kann, was man nach wie folgt sind:

var client = new pg.Client(conString); 
// define your callback here, in theory 
client.connect(); 

function getNEO(callback) { 
    client.on('connect', function() { 
     var query = client.query("SELECT count(*) as count FROM sat_scores")); 

     query.on('end', function(result) { 
      callback(result.rowCount); 
     }); 
    }); 
} 

... so können Sie Ihre getNEO() Funktion aufrufen, wenn Sie so wollen, es für die Verbindung in geeigneter Weise zu komplettieren werde warten und dann können Sie überspringen jede Zeile Tracking, wie es kommt; Das end Ereignis empfängt das result Objekt, das Ihnen alle Zeilen und die Zeilenanzahl gibt, um mit dem zu tun, was Sie wünschen.

+1

docs sagt, es ist besser nutzen cliente pooling: var pool = neue pg.Pool (config); // Um ​​eine Abfrage auszuführen, können wir einen Client aus dem Pool erwerben, // eine Abfrage auf dem Client ausführen und dann den Client an den Pool zurückgeben pool.connect (Funktion (err, client, done)) { – stackdave

+0

@ stackdave excellent advice - Sobald Sie grundlegenden Arbeitscode erhalten, ist der nächste Schritt verstehen die entsprechenden Best Practices, um First-Level-Optimierungen zu tun, wie Client-Pooling verwenden .. – Jason

-1

so hier ist, wie ich in der Lage war, das Problem zu lösen .... Ich zog die var query innerhalb der Funktion

function getNEO(state, callback) { 
    var conString = "postgres://alexa:[email protected]:5439/alexa"; 

    var client = new pg.Client(conString); 
    client.connect(); 
    var data = ''; 
    var query = client.query("SELECT avg(Math) as math, avg(Reading) as reading FROM sat_scores WHERE State = '" + state + "'"); 
    console.log("query is: %s", query); 
    query.on('row', function(row) { 
      console.log("Row cnt is: %s", row.math); 
      console.log("row is: " + row) 
      data += row; 
     }); 
    console.log("made it"); 
    query.on('end', function() { 
    callback(data); 
     }); 
    } 
+0

accord docs müssen Sie immer tun: var client = new pg.Client() ; // Verbindung zu unserer Datenbank herstellen client.connect (Funktion (Fehler)) { if (err) throw err; ... – stackdave

Verwandte Themen