2013-07-18 4 views
6

Mit dem Knoten-Inspector kann der Haltepunkt im folgenden node.js-Code nicht festgelegt werden. (Inhalt von main.js)Kann Haltepunkt innerhalb der Funktion nicht festlegen, wenn require innerhalb von closure verwendet wird

(function() { 
    require('underscore'); 

    var doSomething = function(callback) { 
     callback('doSomething Finished'); 
    } 

    doSomething(function(x) { 
     console.log(x); 
    }); 

}).call(this); 

ich leicht einen Haltepunkt auf der Linie 2, Linie 4 oder Linie 8, jedoch unabhängig davon einstellen, wie hart ich den Debugger versuchen werde mich nicht einen Haltepunkt auf der Linie läßt Set 5 oder Linie 9 klar zu sein, habe ich die folgenden Befehle bin mit Knoten-Inspektor laufen

node --debug-brk main.js 
node-inspector 

ich auch in Web-Sturm zu debuggen versucht jedoch weiterhin besteht das Problem. Wenn ich die Zeile require('underscore'); entferne, verschwindet das Problem sofort und ich bin in der Lage, Breakpoint innerhalb des Funktionskörpers wieder zu setzen. Das Problem verschwindet auch, wenn ich die äußerste Verschlussfunktion entferne. Es scheint, dass die Interaktion zwischen require und Datei-Level-Schließung die Knoten Debugging-Funktionalität vermasselt. Hat jemand dieses Problem selbst erlebt und/oder kennt keine Problemumgehungen, um innerhalb des Funktionskörpers zu brechen?

EDIT: Meine Knoten js Version

Tony:~ $ node --version 
v0.10.12 
Tony:~ $ 
+0

Sie haben hier das requirejs-Tag. Benutzt du requierjs wirklich im Knoten? Wahrscheinlich nicht. –

+0

Ich dachte, Requirejs bietet den 'Require' Aufruf, ist das nicht so? – Tony

+0

Nein, require wird von der nodejs-Laufzeit bereitgestellt. Es ist Teil der CommonJS-Modulspezifikation. –

Antwort

3

Dies ist nicht die Antwort sein, die Sie hören wollen, wie es erklärt nicht, warum Sie keine Breakpoints setzen, aber ich würde einfach entfernen Sie Ihre erfordern Aussage von der Schließung und legen Sie es oberste Ebene. Ich würde noch weiter gehen und empfehlen, dass Sie keine Schließung wie die oben genannte überhaupt verwenden.

Der Grund ist, dass Knoten ein eigenes Modulsystem verwendet, und im Gegensatz zu JavaScript im Browser, deklariert Variablen zu deklarieren oberste Ebene nicht den globalen Namespace. Dies ist der Punkt, an dem (...) benötigt wird. Sie erhalten also nichts, wenn Sie Ihren Code in eine sofort aufgerufene Funktion einfügen (es sei denn, Ihr Modul soll sowohl auf der Clientseite als auch auf der Serverseite ausgeführt werden können).

Ich würde vermuten, dass der Grund dafür, dass Sie keine Haltepunkte setzen können, darin besteht, dass die V8-Laufzeit eine unnötige Schließung erkennt und dann Ihren Code für Sie optimiert. Der neu geschriebene Code verfügt möglicherweise nicht über die richtige Quellzuordnung und daher können Haltepunkte nicht festgelegt werden.

also zwei Vorschläge:

  1. erfordern Anrufe sind nicht wie regelmäßige Aussagen. Sie ähneln den Importanweisungen in Java und werden speziell vom Compiler behandelt. Sie sollten in einer Knotendatei immer oberster Ebene sein.
  2. Sie müssen Ihren Code nicht in eine anonyme Funktion einfügen, wenn Sie sich in Node befinden.
+0

Verstanden, das ist sehr hilfreich. Die Existenz von Top-Level-Schließung ist eigentlich auf CoffeeScript Compilation, ich habe dieses Detail weggelassen, um die Frage eingehender zu machen.Das bedeutet also, ich sollte Kaffee-Skript nur zwingen, ohne Top-Level-Schließung zu kompilieren, um das Problem zu umgehen? Ich werde es ausprobieren und die Ergebnisse melden. – Tony

11

Ich lief genau in das gleiche Problem mit dem gleichen Setup.

Ich habe einen Breakpoint nach die Definition der Zielfunktion hinzugefügt (das war die einzige Stelle, die ich tatsächlich einen Haltepunkt hinzufügen konnte). Wenn der Debugger diesen Breakpoint erreicht hat und die Funktion tatsächlich definiert wurde, konnte ich Breakpoints zur eigentlichen Zielfunktion hinzufügen ...

+2

Definitiv bessere Antwort als akzeptiert. – mbochynski

+0

Das ist es, danke! Bevor der Haltepunkt sofort verschwand, aber wenn der Haltepunkt später platziert wird, funktioniert es. Danke :) –

Verwandte Themen