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

k00*_*00k 301 node.js express

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

这是一些简化的代码.

在我的app.js中,我执行以下操作:

var bla = require('./bla.js');
console.log(bla.bar());
Run Code Online (Sandbox Code Playgroud)

而在bla.js里面是

module.exports = {

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

TypeError: Object # has no method 'foo'

如果我改成this.foo()只是foo()我得到:

ReferenceError: foo is not defined

k00*_*00k 310

我想我明白了.我只是改变this.foo()module.exports.foo(),它似乎是工作.

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

  • 或者你可以简单地执行:exports.foo()它应该工作. (57认同)
  • exports.foo()不起作用,但module.exports.foo()正在使用NodeJS v6.9.1 (14认同)
  • 使用Node.js v5.8.0,`module.exports.foo()`和`exports.foo()`对我来说不起作用. (7认同)
  • 我认为这比接受的答案要好.如果你定义了导出范围之外的函数,它会增加一个额外的间接级别,虽然它有时可能是合乎需要的,但它会使它更复杂,重构,例如重命名函数,查找函数的使用等等. (4认同)
  • @NamNguyen 调用 `exports.foo()` 似乎有点尴尬且难以阅读。 (3认同)
  • 直接回答问题 (2认同)

Bre*_*ett 185

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

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

var bar = function (req, res, next) {
  return foo();
}
Run Code Online (Sandbox Code Playgroud)

然后:

module.exports = {
  foo: foo,
  bar: bar
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我想从方法访问对象的属性怎么办? (11认同)
  • 或者,更简洁地使用 ES6,`module.exports = { foo, bar, }` (4认同)

小智 115

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

var self = module.exports = {

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

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

}
Run Code Online (Sandbox Code Playgroud)

  • 我最喜欢这个.比exports.foo()更容易阅读; (2认同)

Vil*_*lle 61

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

var _this = this;

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

exports.someotherfunction = function() {
   _this.somefunction();
}
Run Code Online (Sandbox Code Playgroud)

  • 一旦 `this` 不再是正确的 `this`,这个建议就会很有用。(承诺和回调) (2认同)

小智 40

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

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

  • 我可以确认这**工作. (6认同)

dav*_*ler 23

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

module.exports = Service
Run Code Online (Sandbox Code Playgroud)

  • 这是特别有用的,因为你的代码调用了`Service.foo()`,你的客户端代码也将使用相同的命名调用`Service.foo()`. (3认同)

m.s*_*tos 13

在NodeJs中我遵循这种方法:

class MyClass {

    constructor() {}

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

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

module.exports = new MyClass();
Run Code Online (Sandbox Code Playgroud)

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


小智 6

为了解决您的问题,我在 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};
Run Code Online (Sandbox Code Playgroud)

并且在 app.js 中没有修改

var bla = require('./bla.js');
console.log(bla.bar());
Run Code Online (Sandbox Code Playgroud)

  • 在功能栏中,this.foo() 不起作用...它需要是 foo() (3认同)