Appelez une fonction "locale" dans le module.exporte depuis une autre fonction dans le module.les exportations?
Comment appelez-vous une fonction à partir d'une autre fonction dans une déclaration module.exports
?
Voici un code simplifié.
Dans mon application.js, je fais ce qui suit:
var bla = require('./bla.js');
console.log(bla.bar());
Et à l'intérieur de bla.js est
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 je reçois:
TypeError: Object # has no method 'foo'
Si je change this.foo()
pour juste {[7] } je reçois:
ReferenceError: foo is not defined
9 réponses
Je crois que je l'ai. Je viens de changer this.foo()
en module.exports.foo()
et cela semble fonctionner.
Si quelqu'un a une méthode meilleure ou plus appropriée, n'hésitez pas à me corriger.
Vous pouvez déclarer vos fonctions en dehors du module.les exportations de bloc.
var foo = function (req, res, next) {
return ('foo');
}
var bar = function (req, res, next) {
return foo();
}
Puis:
module.exports = {
foo: foo,
bar: bar
}
Vous pouvez aussi 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:
var self = module.exports = {
foo: function (req, res, next) {
return ('foo');
},
bar: function(req, res, next) {
self.foo();
}
}
Vous pouvez également enregistrer une référence à la portée globale du module en dehors du (module.)exportation.définition du module:
var _this = this;
exports.somefunction = function() {
console.log('hello');
}
exports.someotherfunction = function() {
_this.somefunction();
}
Une autre option, et plus proche du style original de L'OP, consiste à placer l'objet que vous souhaitez exporter dans une variable et à référencer cette variable pour faire des appels à d'autres méthodes de l'objet. Vous pouvez ensuite exporter cette variable et vous êtes prêt à partir.
var self = {
foo: function (req, res, next) {
return ('foo');
},
bar: function (req, res, next) {
return self.foo();
}
};
module.exports = self;
const Service = {
foo: (a, b) => a + b,
bar: (a, b) => Service.foo(a, b) * b
}
module.exports = Service
Dans NodeJs j'ai suivi cette approche:
class MyClass {
constructor() {}
foo(req, res, next) {
return ('foo');
}
bar(req, res, next) {
this.foo();
}
}
module.exports = new MyClass();
Cela instanciera la classe une seule fois, en raison de la mise en cache du module du nœud:
https://nodejs.org/api/modules.html#modules_caching
Pour résoudre votre problème, j'ai fait quelques changements dans bla.js et ça marche,
var foo= function (req, res, next) {
console.log('inside foo');
return ("foo");
}
var bar= function(req, res, next) {
this.foo();
}
module.exports = {bar,foo};
Et aucune modification dans l'application.js
var bla = require('./bla.js');
console.log(bla.bar());
module.exports = function (){
return{
adding: function(a ,b){
return a+b;
},
test: function () {
adding(a, b);
}
}
}
Puis-je savoir comment accéder à "ajout" de la fonction" test"?