2013-07-18 9 views
6

Utilizzando ispettore nodo, non riesco a impostare il punto di interruzione nel seguente codice node.js. (Contenuto di main.js)Impossibile impostare il punto di interruzione all'interno della funzione quando si richiede la chiusura interna

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

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

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

}).call(this); 

posso facilmente impostare un punto di interruzione sulla linea 2, linea 4 o linea 8, ma non importa quanto sia difficile provare il debugger non mi permette di impostare un punto di interruzione sulla linea 5 o linea 9. per essere chiari, sto usando i seguenti comandi per eseguire nodo ispettore

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

ho anche cercato di debug nel web tempesta, tuttavia il problema persiste. Se rimuovo la riga require('underscore');, il problema scompare immediatamente e sono in grado di impostare nuovamente il punto di interruzione all'interno del corpo della funzione. Il problema scompare anche se rimuovo la funzione di chiusura più esterna. Sembra che l'interazione tra require e la chiusura a livello di file stia rovinando la funzionalità di debug dei nodi. Qualcuno ha avuto questo problema da solo e/o conosce qualche soluzione alternativa per essere in grado di rompere all'interno del corpo della funzione?

EDIT: versione mio nodo js

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

Hai il tag requirejs qui. Stai davvero usando requierjs nel nodo? Probabilmente no. –

+0

Ho pensato che requirejs fornisce la chiamata 'require', non è così? – Tony

+0

No, require viene fornito dal runtime nodejs. Fa parte delle specifiche del modulo CommonJS. –

risposta

3

Questo non può essere la risposta che si desidera ascoltare in quanto non spiega il motivo per cui non è possibile impostare tutti i punti di interruzione, ma vorrei semplicemente rimuovere il vostro bisogno dichiarazione dalla chiusura e posizionarlo al massimo livello. Vorrei andare ancora oltre e raccomandare che non si utilizzi affatto una chiusura come quella sopra.

La ragione è che il nodo usa il proprio sistema di moduli, e diversamente da Javascript nel browser, dichiarare che le variabili di primo livello non inquinano lo spazio dei nomi globale. Qui è dove richiede (...). Quindi, non ottieni nulla avvolgendo il tuo codice in una funzione immediatamente invocata (a meno che, ovviamente, non vuoi che il tuo modulo sia in grado di eseguire sia lato client che lato server).

Direi che il motivo per cui non si è in grado di impostare alcun punto di interruzione è che il runtime V8 riconosce una chiusura non necessaria e quindi ottimizza il codice per conto dell'utente. Il codice riscritto potrebbe non avere il mapping sorgente corretto e quindi non è possibile impostare i breakpoint.

Così, due suggerimenti:

  1. richiedono le chiamate non sono come le dichiarazioni regolari. Sono più simili alle istruzioni import in Java e sono gestiti appositamente dal compilatore. Dovrebbero sempre essere di primo livello in un file di nodo.
  2. Non è necessario avvolgere il codice in una funzione anonima quando si è nel nodo.
+0

Capito, è molto utile. L'esistenza della chiusura di livello superiore è in realtà dovuta alla compilazione di CoffeeScript, ho omesso quel dettaglio per rendere la domanda più contenuta.Quindi questo significa che dovrei semplicemente costringere il copione del caffè a compilare senza la chiusura di livello superiore per risolvere il problema? Lo proverò e riferirò i risultati. – Tony

11

Ho eseguito esattamente lo stesso problema con la stessa configurazione.

Ho aggiunto un punto di interruzione dopo la la definizione della funzione di destinazione (che era l'unico posto in cui potevo effettivamente aggiungere un punto di interruzione). Quando il debugger ha raggiunto quel punto di interruzione e la funzione è stata effettivamente definita, sono stato in grado di aggiungere punti di interruzione all'effettiva funzione di destinazione ...

+2

Risposta decisamente migliore di quella accettata. – mbochynski

+0

Grazie! Prima che il punto di interruzione scomparisse all'istante, ma quando si posiziona il punto di interruzione in un secondo momento, funziona. grazie :) –

Problemi correlati