Comment appeler une fonction à partir d'une autre fonction dans une module.exports
déclaration?
var bla = require('./bla.js');
console.log(bla.bar());
bla.js
module.exports = {
foo: function (req, res, next) {
return ('foo');
},
bar: function(req, res, next) {
this.foo();
}
}
J'essaie d'accéder à la fonction foo
depuis la fonction bar
et j'obtiens:
TypeError: l'objet # n'a pas de méthode 'foo'
Si je change this.foo()
juste, foo()
je reçois:
ReferenceError: foo n'est pas défini
v8.12.0
et ne renvoie plus l'erreur.bar
n'a pas de déclaration de retour, donc l'exécutionconsole.log(bla.bar())
revient simplementundefined
Réponses:
Remplacer
this.foo()
parmodule.exports.foo()
la source
exports.foo()
semble un peu gênant et difficile à lire.module.exports.foo()
etexports.foo()
ne fonctionne pas pour moi avec Node.js v5.8.0.Vous pouvez déclarer vos fonctions en dehors du
module.exports
bloc.Ensuite:
la source
module.exports = { foo, bar, }
Vous pouvez également le faire pour le rendre plus concis et lisible. C'est ce que j'ai vu faire dans plusieurs des modules open source bien écrits:
la source
Vous pouvez également enregistrer une référence à la portée globale du module en dehors de la définition (module.) Exports.somemodule:
la source
this
directement, pas besoin de déclarer_this
this
n'est plus la bonnethis
. (Promesses et rappels)Une autre option, et plus proche du style d'origine de l'OP, consiste à placer l'objet que vous souhaitez exporter dans une variable et à référencer cette variable pour appeler d'autres méthodes dans l'objet. Vous pouvez ensuite exporter cette variable et vous êtes prêt à partir.
la source
la source
Service.foo()
et votre code client sera également appeléService.foo()
avec le même nom.À partir de la version 13 de Node.js, vous pouvez profiter des modules ES6 .
En suivant l'approche de classe:
Cela instanciera la classe une seule fois, en raison de la mise en cache du module de Node:
https://nodejs.org/api/modules.html#modules_caching
la source
foo
était statique que vous appelez à l' intérieurbar
comme ceci:MyClass.foo()
.Pour résoudre votre problème, j'ai apporté quelques modifications dans bla.js et cela fonctionne,
et aucune modification dans app.js
la source