381

如何从module.exports声明中的另一个函数中调用一个函数?

应用程序.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()改为 justfoo()我得到:

ReferenceError: foo 未定义

4

9 回答 9

455

更改this.foo()module.exports.foo()

于 2012-05-05T13:21:46.580 回答
200

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

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

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

然后:

module.exports = {
  foo: foo,
  bar: bar
}
于 2012-10-09T06:43:17.897 回答
128

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

var self = module.exports = {

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

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

}
于 2015-03-20T21:45:25.447 回答
67

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

var _this = this;

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

exports.someotherfunction = function() {
   _this.somefunction();
}
于 2013-05-07T20:09:57.190 回答
42

另一种选择,更接近 OP 的原始样式,是将要导出的对象放入变量中并引用该变量以调用对象中的其他方法。然后,您可以导出该变量,一切顺利。

var self = {
  foo: function (req, res, next) {
    return ('foo');
  },
  bar: function (req, res, next) {
    return self.foo();
  }
};
module.exports = self;
于 2013-10-03T15:54:24.707 回答
27
const Service = {
  foo: (a, b) => a + b,
  bar: (a, b) => Service.foo(a, b) * b
}

module.exports = Service
于 2017-06-09T15:22:35.803 回答
19

Node.js 版本 13开始,您可以利用ES6 模块

export function foo() {
    return 'foo';
}

export function bar() {
    return foo();
}

遵循类方法:

class MyClass {

    foo() {
        return 'foo';
    }

    bar() {
        return this.foo();
    }
}

module.exports = new MyClass();

由于节点的模块缓存,这将只实例化一次类:
https ://nodejs.org/api/modules.html#modules_caching

于 2016-10-23T18:47:43.973 回答
7

为了解决您的问题,我对 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());
于 2018-07-17T14:11:12.340 回答
0

我所做的是创建一个独立的foo函数并在两个地方引用它。

这样,this无论使用箭头还是常规功能,它都可以防止任何问题

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

然后我可以foo在两个地方参考

module.exports = {

  foo, // ES6 for foo:foo

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

}
于 2021-09-09T20:59:23.680 回答