387 votes

Appeler une fonction "locale" à l'intérieur de module.exports depuis une autre fonction dans module.exports?

Comment appeler une fonction depuis une autre fonction dans une déclaration module.exports?

app.js

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();
  }

}

Je tente d'accéder à la fonction foo depuis la fonction bar, et j'obtiens:

TypeError: Object # has no method 'foo'

Si je change this.foo() en juste foo() je reçois:

ReferenceError: foo is not defined

6 votes

J'ai testé votre code et je n'ai pas d'erreurs. La fonction bar retourne undefined car il n'y a pas d'instruction de retour. Êtes-vous sûr de tester correctement ?

1 votes

Testé dans la version de node v8.12.0 et ne renvoie plus d'erreur. bar n'a pas d'instruction de retour, donc l'exécution de console.log(bla.bar()) renvoie simplement undefined

0 votes

@Ferchi merci, j'ai manqué la même chose simple.

467voto

k00k Points 1594

Changer this.foo() en module.exports.foo()

3 votes

@NamNguyen Appeler exports.foo() semble un peu maladroit et difficile à lire.

5 votes

Je pense que c'est mieux que la réponse acceptée. Si vous définissez des fonctions en dehors de la portée des exports, cela ajoute un niveau supplémentaire d'indirection, et bien que parfois cela puisse être souhaitable, cela rend les choses plus compliquées, pour refactoriser, par exemple pour renommer la fonction ou trouver son utilisation, etc.

2 votes

Une réponse directe à la question

201voto

Brett Points 1178

Vous pourriez déclarer vos fonctions en dehors du bloc module.exports.

var foo = function (req, res, next) {
  return ('foo');
}

var bar = function (req, res, next) {
  return foo();
}

Ensuite :

module.exports = {
  foo: foo,
  bar: bar
}

11 votes

Et si je voulais accéder aux propriétés de l'objet à partir de la méthode?

1 votes

Je reçois TypeError: votreClasse.votreMéthode n'est pas une fonction lorsque j'ai fait cela. J'utilise la version node 6.9.1. Faut-il avoir une instruction return? Je n'ai pas d'instructions return car tout mon code est asynchrone dans les fonctions.

1 votes

Belle comparaison de différents styles -- gist.github.com/kimmobrunfeldt/10848413

68voto

Ville Points 366

Vous pouvez également enregistrer une référence à la portée globale du module en dehors de la définition de (module.)exports.somemodule :

var _this = this;

exports.somefunction = function() {
   console.log('hello');
}

exports.someotherfunction = function() {
   _this.somefunction();
}

0 votes

C'est une solution plus propre!

0 votes

Pas besoin de _ceci et vous pouvez simplement utiliser cela où vous en avez besoin

0 votes

A utilisé this directement, pas besoin de déclarer _this

42voto

goozbox Points 71

Une autre option, et plus proche du style original de l'OP, est de mettre l'objet que vous souhaitez exporter dans une variable et de 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.

var self = {
  foo: function (req, res, next) {
    return ('foo');
  },
  bar: function (req, res, next) {
    return self.foo();
  }
};
module.exports = self;

1voto

timoxley Points 1973

Simplement retourner de this.foo();

  bar: function(req, res, next) {
    return this.foo();
  }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X