Ich habe gerade angefangen, mit node.js (und Javascript) herumzuspielen und kann ein grundlegendes Missverständnis haben. Der folgende Code funktioniert wie erwartet. Es stammt aus einem Tutorial für eine einfache API mit Express, mit Ausnahme der extrahierten Funktion, um die Daten zu erhalten (aber das Problem tritt auch bei Restify mit Ausnahme einer weniger informativen Stack-Trace auf).Warum ist `this` in einer übergebenen Methode/Funktion anders als in einem Methodenaufruf an einem übergebenen Objekt
var express = require('express');
var app = express();
var getdataandsend = function(request,response) {
var res = {a:1,b:2}; // actually sql query using request.params
response.send(res);
}
app.get('/:id', function (request, response) {
getdataandsend(request,response);});
var server = app.listen(1234, function() {});
Da ich nur response
zu getandsenddata
passieren, um in seine send
Methode aufrufen, dachte ich, als auch eine Referenz/Zeiger auf das Verfahren selbst anstelle des gesamten Objekts passieren könnte:
var getdataandsend = function(request,respfun) {
respfun({a:1,b:2});
}
app.get('/:id', function (request, response) {
getdataandsend(request,response.send);});
Aber das ergibt sich folgende
TypeError: Cannot read property 'req' of undefined
at send (...\test\node_modules\express\lib\response.js:103:17)
at getdataandsend (...\test\misctest.js:6:9)
at ...\test\misctest.js:9:6
at Layer.handle [as handle_request] (...\test\node_modules\express\lib\router\layer.js:95:5)
...
die entsprechende Zeile in response.js ist var req = this.req;
, das ist das erste Auftreten einer Variablen dieses Namens in dieser Datei. Anscheinend unterscheidet sich der Wert this
zwischen den beiden obigen Aufrufen, obwohl die Methode send
des Antwortobjekts von derselben Stelle (getdataandsend
) aufgerufen wird. Nach this answer und that answer kann das beobachtete Verhalten sinnvoll sein, wenn der erste Aufruf als eine Methode und der zweite als Funktionsaufruf betrachtet wird, aber warum sollte das der Fall sein? send
ist immer noch eine Methode von response
, oder? Oder sind beide Funktionsaufrufe (... was ist dann response
)?
Die höher bewertete Antwort hat viel mehr Informationen als die angenommene Antwort, also lesen Sie beide. –