Вызовите "локальную" функцию в модуле.экспорт из другой функции в модуле.экспорт?

как вызвать функцию внутри другой функции в module.exports декларации?

вот несколько упрощенный код.

в моем приложении.js, я делаю следующее:

var bla = require('./bla.js');
console.log(bla.bar());

и внутри bla.js is

module.exports = {

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

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

}

Я пытаюсь получить доступ к функции foo из функции bar, и я получаю:

TypeError: Object # has no method 'foo'

если я изменю this.foo() просто foo() Я:

ReferenceError: foo is not defined

9 ответов


Кажется, я понял. Я просто изменился this.foo() до module.exports.foo() и, похоже, это работает.

Если у кого-то есть лучший или более правильный метод, пожалуйста, не стесняйтесь исправить меня.


вы можете объявить свои функции вне модуля.блок экспорта.

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

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

затем:

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

вы также можете сделать это, чтобы сделать его более лаконичным и читаемым. Это то, что я видел в нескольких хорошо написанных модулях с открытым исходным кодом:

var self = module.exports = {

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

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

}

вы также можете сохранить ссылку на глобальную область модуля за пределами (module.)поставляемый.определение somemodule:

var _this = this;

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

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

другой вариант и ближе к исходному стилю OP-поместить объект, который вы хотите экспортировать в переменную, и ссылаться на эту переменную для вызова других методов в объекте. Затем вы можете экспортировать эту переменную, и вы можете идти.

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

в NodeJs я следовал этому подходу:

class MyClass {

    constructor() {}

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

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

module.exports = new MyClass();

это создаст экземпляр класса только один раз, из-за кэширования модуля узла:
https://nodejs.org/api/modules.html#modules_caching


исправить вашу проблему, я сделал несколько изменений в БПВ.JS и он работает,

var foo= function (req, res, next) {
  console.log('inside foo');
  return ("foo");
}

var  bar= function(req, res, next) {
  this.foo();
}
module.exports = {bar,foo};

и никаких изменений в приложении.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);
    }
}

}

могу ли я знать, как получить доступ к функции "добавление" из функции "тест"?