2017-09-21 5 views
0

J'apprends comment fonctionne la fonction require() de NodeJS pour mieux comprendre l'écosystème des nœuds.Erreur NodeJS lorsque j'ai besoin d'un module._compile

J'ai écrit un script qui utilise module._compile pour compiler un script. Quand j'essaie de require() dans la chaîne, il rechigne ... mais il semble avoir les bons chemins. Qu'est-ce que je fais mal?

Je suppose que cela vaut la peine de mentionner que j'ai le module json3 installé dans le même répertoire dans ./node_modules/.

Le script

j'ai écrit ce script, qui fonctionne - jusqu'à ce que je décommentez la ligne qui est marqué.

"use strict"; 

var json3 = require('json3'); 

console.log("require.main.filename:", require.main.filename); 
console.log("require.main:", require.main); 

var module = new module.constructor(); 
module._compile(` 
"use strict"; 

console.log("require.main.filename:", require.main.filename); 
console.log("require.main:", require.main); 

// When I uncomment this, it breaks. Why? 
//var json3 = require('json3'); 

module.exports = { 
    run: function() { console.log("It works!") } 
}; 
`, require.main.paths[0]); 

module.exports.run(); 

Script sortie

est ici la sortie (lorsque le code de problème est commenté). require.main.filename: /home/user/tmp/tmp.js require.main: Module { id: '.', exports: {}, parent: null, filename: '/home/user/tmp/tmp.js', loaded: false, children: [ Module { id: '/home/user/tmp/node_modules/json3/lib/json3.js', exports: [Object], parent: [Circular], filename: '/home/user/tmp/node_modules/json3/lib/json3.js', loaded: true, children: [], paths: [Array] } ], paths: [ '/home/user/tmp/node_modules', '/home/user/node_modules', '/home/node_modules', '/node_modules' ] } require.main.filename: /home/user/tmp/tmp.js require.main: Module { id: '.', exports: {}, parent: null, filename: '/home/user/tmp/tmp.js', loaded: false, children: [ Module { id: '/home/user/tmp/node_modules/json3/lib/json3.js', exports: [Object], parent: [Circular], filename: '/home/user/tmp/node_modules/json3/lib/json3.js', loaded: true, children: [], paths: [Array] } ], paths: [ '/home/user/tmp/node_modules', '/home/user/node_modules', '/home/node_modules', '/node_modules' ] } It works!

Pourquoi pas le module dans le ad hoc charge du module?

Répondre

2

Donc deux choses dans votre code. Lorsque vous faites

var module = new module.constructor(); 

Vous perdez l'objet module d'origine, vous ne devriez pas faire cela. Ensuite, pour savoir quel est le problème exact, vous devez avoir défini la variable d'environnement NODE_DEBUG=module. Cela vous donnera ce qui se passe en arrière-plan. En faisant cela, vous obtenez un message d'importation

MODULE 11063: looking for "json3" in [] 

Cela signifie qu'aucun chemin n'est défini pour le chargement du module. Donc, vous devriez ajouter les chemins aussi. Ci-dessous le code mis à jour

"use strict"; 

var json3 = require('json3'); 
var os = require("os"); 
console.log("require.main.filename:", require.main.filename); 
console.log("require.main:", require.main); 

var _module = new module.constructor(); 
_module.paths = module.paths; 

_module._compile(` 
"use strict"; 

// console.log("require.main.filename:", require.main.filename); 
// console.log("require.main:", require.main); 

//When I uncomment this, it breaks. Why? 
var json3 = require('json3'); 

module.exports = { 
    run: function() { console.log("It works!") } 
}; 
`, __dirname + "/dynamic_code_loaded_at_run_time.js"); 

_module.exports.run(); 

également le deuxième paramètre de _compile est le nom du fichier qui est en cours de chargement, de sorte que vous ne devriez pas fournir un chemin, mais un nom de fichier. Et maintenant vous obtenez la sortie correcte

It works! 
+0

En fin de compte, cela m'a donné tout ce dont j'avais besoin. Merci! Dans le cas où quelqu'un venant ici est également intéressé, vous pouvez ajouter des variables au module comme vous le souhaitez: en dehors du module, utilisez _module.stuff = mystuff; et à l'intérieur du module y accéder avec module.stuff; –