Helpdesk
Menschen Wissenschaft Politik Mystery Kriminalfälle Spiritualität Verschwörungen Technologie Ufologie Natur Umfragen Unterhaltung
weitere Rubriken
PhilosophieTräumeOrteEsoterikLiteraturAstronomieHelpdeskGruppenGamingFilmeMusikClashVerbesserungenAllmysteryEnglish
Diskussions-Übersichten
BesuchtTeilgenommenAlleNeueGeschlossenLesenswertSchlüsselwörter
Schiebe oft benutzte Tabs in die Navigationsleiste (zurücksetzen).

Programmieren: Hilfe & Austausch

920 Beiträge ▪ Schlüsselwörter: Programm, Code, Html ▪ Abonnieren: Feed E-Mail

Programmieren: Hilfe & Austausch

18.11.2012 um 14:18
Also ich habe ein seltsames Problem, bei dem ich gerade auf dem Schlauch stehe.

Erstmal zur Erklärung: Ich arbeite an einem Node.JS Projekt. Bedeutet: Serverseitig Javascript. Es geht also nicht um clientseitig ausgeführten Code.

Habe eine Funktion geschrieben, mit der ich Datenbankabfragen (SQL) durchführen kann. Die funktioniert auch wunderbar ansich. Nur wenn ich die Funktion aufrufe:
var result = dbfunc("SELECT * FROM test", []);
dann bleibt "result" undefiniert.

Debugausgaben zeigen aber, dass das zurückgegebene Array durchaus befüllt ist, innerhalb der Funktion.

Eine weitere Testfunktion, die edenfalls eine gleiche Arraystruktur zurückgibt, funktioniert. Meine Vermutung ist nun, dass das Programm schon "result" ausgibt, bevor überhaupt eine Rückgabe erfolgt.

Was mache ich falsch? :D


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 14:23
Hier mal die Funktion:
function dbe (sql, stored) { if (typeof sql != "undefined") { console.log('[' + time_gen('hr:min:sec') + '] func dbe: ' + sql + ' (' + stored + ')'); db.query(sql, stored, function(err, rows, fields) { //if (err) throw err; if (err) console.log('[' + time_gen('hr:min:sec') + '] func dbe (error): ' + err); //debug if (!err && typeof rows != "undefined" && typeof fields != "undefined") { console.log('func dbe (debug):'); console.dir({ f: fields, r: rows }); return { f: fields, r: rows }; } else { console.log('func dbe (debug): no data'); return { f: '', r: '' }; } }); } }

Testfunktion zum Vergleich:
function artest () { return { a: ['1', '2'], b: ['1', '2'] }; }


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 16:12
@acc

das liegt daran das du nirgends einen Rückgabewert definiert hast...

die Returns gelten doch nur für das Funktional in der db.query abfrage...


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 16:29
und vielleicht solltest du die funktion aufrufen, die du verwenden willst...

also dbe statt dbfunc :)


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 16:57
@interpreter
Ja klar, wirds ja, das war oben nur ein Beispiel-Code :)
Aber die Funktion schmeisst doch per return das Array raus :0


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 17:01
@acc

das Return gilt für das Funktional also die Callback Funktion die du als Parameter in der Datenbank-Abfrage übergibst...

du musst für die Rahmenfunktion ein eigenes Return einfügen, was dann etwa so aussehen würde:

return stored;


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 17:07
@acc

Oder, wenn du das stored als Übergabeparameter modifizieren wolltest müsstest du die Funktion anders aufrufen:

var result = []; dbfunc("SELECT * FROM test", result);

ich bin mir aber nicht sicher ob das bei JS funktioniert... bei Java geht es nicht.


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 17:12
@interpreter
stored steht nicht fürs ergebnis, sondern ist der zweite übergabeparameter der funktion. stichwort prepared statements.

var result = dbe("SELECT * FROM test WHERE feld1 = ? AND feld2 = ?", ['feld1_data', 'feld2_data']);

(Edit: Prepared Statements sind eine Sicherheitsmaßnahme gegen SQL-Injections)

aber irgendwie verstehe ich gerade nicht wie du das mit return meinst. kannst du vielleicht einen kleinen beispielcode zeigen, anhand dem das gezeigt wird?


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 17:24
@acc

du hast eine funktion in einer Funktion...


function(bla,bla){

function(bla,bla) //heißt bei dir db.query

//an dieser Stelle ist der Rückgabewert der Funktion die du da drinnen aufgerufen hast verschwunden.

}


in der DB-Query Funktion hast du zwar das Return Statement.

Das wird allerdings nur innerhalb dieser Funktion angewendet und ist für die Rahmenfunktion nicht relevant, es ist ja eines der parameter

(...,..., function(err, rows, field){
return
return

})

hier isses weg.


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 17:32
@interpreter
ah, natürlich... man bin ich blind :D


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 17:33
@acc

Sowas passiert wenn der GROSSE JAVA dir zürnt...

opfere ihm eine Flasche Whisky indem du sie in den Programmierer schüttest und dabei das Handbuch rezitierst :)


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 17:34
@interpreter
Ich räuchere einfach :ganja: :D


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 17:35
Von Perl zu PHP zu JS - so manch einer würde behaupten ich baue ab :D


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 17:39
@acc

JS-Node soll ja recht schnell sein... aber mir gefällt das Programmier-Konzept nicht... würde eher auf Ruby on Rails setzen.


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 17:41
@interpreter
Also grundsätzlich bin ich damit sehr zufrieden.
Ruby schau ich mir auch mal noch näher an.


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 17:43
@acc

ja... man muss das Konzept halt mögen...


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 17:44
@interpreter
Zu Anfang war es mir sehr suspekt, aber wenn man sich etwas damit beschäftigt, dann sieht man nur noch die coolen Möglichkeiten :D


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 17:46
Die Möglichkeiten hat man auch in Ruby beispielsweise... aber die Grenzen nerven mich...


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 17:47
@interpreter
Welche Grenzen denn so?


melden

Programmieren: Hilfe & Austausch

18.11.2012 um 17:53
@acc

zum Beispiel hast du einen relativ begrenzten Einfluss auf den Programmfluss... und kein Threading und sowas...

das mit den Pausen und der Wiederholten Ausführung und so.. ich mags nicht...


melden