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

244
demandé sur k00k 2012-05-05 17:15:00

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.

238
répondu k00k 2012-05-05 13:21:46

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
}
165
répondu Brett 2012-10-09 06:43:17

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

}
91
répondu Calvin Alvin 2015-03-20 21:45:25

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();
}
57
répondu Ville 2013-05-07 20:09:57

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;
38
répondu goozbox 2013-10-03 15:54:24
const Service = {
  foo: (a, b) => a + b,
  bar: (a, b) => Service.foo(a, b) * b
}

module.exports = Service
13
répondu david_adler 2017-06-09 15:22:35

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

10
répondu m.spyratos 2016-10-23 18:47:43

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());
0
répondu Akash Jain 2018-07-17 14:11:12
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"?

-2
répondu Win 2017-11-18 18:49:02