2014-07-16 3 views
1

Je cherche le meilleur moyen de remplacer une méthode dans un noeud de module personnalisé.Méthode de remplacement dans node.js

Je travaille sur un middleware personnalisé qui va m'aider à charger automatiquement un module personnalisé. Comme la sécurité, les utilisateurs etc ...

Mais je veux être en mesure de remplacer certaines méthodes si j'ai besoin de quelque chose comme un contrôle de sécurité personnalisé. Pour l'instant, la seule façon que j'ai trouvé est d'exporter une fonction qui va remplacer ma méthode et exposer les variables de contexte.

// CUSTOM MODULE EXAMPLE 
// ======================================== 

var myVar = "Hello "; 
var myVar2 = "!"; 

var method = function() { 
    return "world" + myVar2; 
} 

module.exports.loadModule = function() { 
    console.log(myVar + method()); 
}; 

module.exports.overrideMethod = function(customMethod) { 
    method = customMethod; 
}; 

module.exports.myVar2 = myVar2; 

Et mon application principale sera comme ça:

// MAIN APP EXAMPLE 
// ======================================== 

var myCustomModule = require('customModule.js'); 

myCustomModule.overrideMethod(function() { 
    return "viewer" + myCustomModule.myVar2; 
}); 

myCustomModule.loadModule(); 

Que pensez-vous? Suis-je sur le bon chemin?

Merci pour la lecture. Tom

+0

travail est assez bon. vous pouvez même simplement en importer un, réduire certaines choses à l'exportation et utiliser le nouveau module à la place de l'ancien. – dandavis

Répondre

1

Généralement, je considère que tout module ayant un état global mutable comme celui-ci est une erreur. Au lieu de cela, j'opterais pour créer un objet avec ces méthodes et avoir un moyen de passer en overrides.

// CUSTOM MODULE EXAMPLE 
// ======================================== 

var DEFAULT_PREFIX = "Hello "; 
var DEFAULT_SUFFIX = "!"; 


var DEFAULT_METHOD = function() { 
    return "world" + DEFAULT_SUFFIX; 
}; 

module.exports = function(options){ 
    var method = options.method || DEFAULT_METHOD 

    return { 
     loadModule: function(){ 
      console.log(myVar + method()); 
     } 
    }; 
}; 

module.exports.DEFAULT_SUFFIX = DEFAULT_SUFFIX; 

Ensuite, vous pouvez utiliser cela comme ceci:

// MAIN APP EXAMPLE 
// ======================================== 

var myCustomModule = require('customModule.js'); 

var loader = myCustomModule({ 
    method: function() { 
     return "viewer" + myCustomModule.DEFAULT_SUFFIX; 
    } 
}); 

loader.loadModule(); 
+0

Merci beaucoup. C'est exactement ce que je cherche :) –

Questions connexes