从module.exports中的另一个函数调用module.exports中的“local”函数?

时间:2012-05-05 13:15:01

标签: node.js express

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

}

我正在尝试从函数foo中访问函数bar,我得到了:

TypeError: Object # has no method 'foo'

如果我将this.foo()改为foo(),我会得到:

ReferenceError: foo is not defined

8 个答案:

答案 0 :(得分:278)

我想我明白了。我刚刚将this.foo()更改为module.exports.foo(),它似乎正在运作。

如果某人有更好或更正确的方法,请随时纠正我。

答案 1 :(得分:179)

您可以在module.exports块之外声明您的函数。

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

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

然后:

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

答案 2 :(得分:106)

您也可以这样做,使其更简洁,更易读。这是我在几个编写良好的开源模块中所看到的:

var self = module.exports = {

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

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

}

答案 3 :(得分:61)

您还可以在(module。)exports.somemodule定义之外保存对模块全局范围的引用:

var _this = this;

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

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

答案 4 :(得分:39)

另一个选项,更接近OP的原始样式,是将要导出的对象放入变量并引用该变量以调用对象中的其他方法。然后你可以导出那个变量,你就可以了。

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

答案 5 :(得分:22)

const Service = {
  foo: (a, b) => a + b,
  bar: (a, b) => Service.foo(a, b) * b
}

module.exports = Service

答案 6 :(得分:11)

在NodeJ中,我采用了这种方法:

class MyClass {

    constructor() {}

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

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

module.exports = new MyClass();

由于Node的模块缓存,这只会实例化一次类:
https://jsfiddle.net/oyq47zsj/

答案 7 :(得分:4)

为解决您的问题,我对bla.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};

并且在app.js中没有修改

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