module.exports의 다른 함수에서 module.exports 내에서 "local"함수를 호출 하시겠습니까?


327

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

}

function foo내에서 함수 에 액세스하려고하는데 다음 bar과 같은 결과가 나타납니다.

TypeError : 개체 #에 'foo'메서드가 없습니다

내가 this.foo()그냥 변경하면 다음 을 foo()얻습니다.

ReferenceError : foo가 정의되지 않았습니다


4
코드를 테스트했지만 오류가 없습니다. bar 함수는 return 문이 없으므로 undefined를 반환합니다. 올바르게 테스트하고 있습니까?
Ferchi

1
노드 버전에서 테스트되었으며 v8.12.0더 이상 오류가 발생하지 않습니다. barreturn 문이 없으므로 console.log(bla.bar())단순히 실행 만 반환undefined
VladNeacsu

답변:


351

변경 this.foo()module.exports.foo()


1
@NamNguyen 전화 exports.foo()는 조금 어색하고 읽기 어려워 보입니다.
Afshin Mehrabani

4
나는 이것이 받아 들인 대답보다 낫다고 생각합니다. 내보내기 범위를 벗어난 함수를 정의하면 추가 수준의 간접적 인 추가가 필요하지만 때때로 바람직 할 수 있지만 리팩터링 (예 : 함수 이름 바꾸기, 함수 사용법 찾기 등)하는 것이 더 복잡해집니다.
Pierre Henry

1
질문에 대한 직접적인 답변
Kermit_ice_tea

8
module.exports.foo()exports.foo()Node.js를의 v5.8.0로 나를 위해 작동하지 않습니다.
betweenbrain

14
exports.foo () 작동하지 않고 module.exports.foo ()는 NodeJS의 v6.9.1와 협력
R. Canser Yanbakan

191

module.exports블록 외부에서 함수를 선언 할 수 있습니다 .

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

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

그때:

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

11
메소드에서 객체의 속성에 액세스하려면 어떻게해야합니까?
Rockstar5645

1
TypeError가 발생합니다 : yourClass.youMethod는이 작업을 수행 할 때 함수가 아닙니다. 노드 버전 6.9.1을 사용하고 있습니다. 당신은 반환 진술을해야합니까? 모든 코드가 함수에서 비동기이기 때문에 return 문이 없습니다.
Brett Mathe

1
다른 스타일의 멋진 비교 -gist.github.com/kimmobrunfeldt/10848413
Tadas V.

아주 좋은 구현! +1
realnsleo

2
또는 ES6를보다 간결하게 사용하여module.exports = { foo, bar, }
Let Me Tink About It

118

더 간결하고 읽기 쉽게 만들 수도 있습니다. 이것은 잘 작성된 오픈 소스 모듈 중 일부에서 본 것입니다.

var self = module.exports = {

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

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

}

이 Node.js 버전은 구체적입니까? v5.8.0으로 이것을 시도하고 있으며 정의되지 않은 상태로 로깅 중입니다.
betweenbrain

1
@doublejosh ... 질문을 읽었습니까? 내 보낸 함수를 다른 함수에서 호출하는 방법을 묻습니다. 액세스 제한과 는 아무런 관련없습니다 .
Fund Monica의 소송

1
예, 읽었습니다. 다시 읽으십시오. 이 답변은 foo ()를 모듈과 함께 내보내는데, 이는 모듈 내에서만 호출 된 "로컬"함수의 지점에 위배됩니다.
doublejosh

66

(module.) exports.somemodule 정의 외부에 모듈의 전역 범위에 대한 참조를 저장할 수도 있습니다.

var _this = this;

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

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

더 깨끗한 솔루션입니다!
IvanZh

_this가 필요하지 않으며 필요한 곳에서 간단히 사용할 수 있습니다
Yuki

this직접 사용 , 선언 할 필요 없음_this
Darius

1
그 제안은 한 번 유용 this하지만 더 이상 옳지 않습니다 this. (약속 및 콜백)
Andrew McOlash

NodeJS 모듈의 범위 지정 예를 제공하기 때문에이 솔루션이 가장 좋습니다.
miguelmorin

40

OP의 원래 스타일에 더 가까운 또 다른 옵션은 내보내려는 개체를 변수에 넣고 해당 변수를 참조하여 개체의 다른 메서드를 호출하는 것입니다. 그런 다음 해당 변수를 내보낼 수 있습니다.

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

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

module.exports = Service

3
이것은 코드가 호출 Service.foo()하고 클라이언트 코드도 Service.foo()동일한 이름 으로 호출 하기 때문에 사용할 수 있습니다 .
빈스 Bowdren

이것은 완벽한 답변입니다!
Jayant Varshney

16

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


그리고이 접근법으로 어떻게 정적 메소드를 호출합니까?
Plixxer 2018 년

@CodeofGod 다른 정적 메소드를 호출하는 것처럼 호출하십시오. 이 경우 foo정적 인 경우 bar다음과 같이 내부에서 호출합니다 MyClass.foo().
m.spyratos 2016 년

그래, 나는 그것을 얻지 만 그것을 가져 오는 컨트롤러에서 어떻게 호출 할 것입니까 ... const oAccounts = require ( "...");
Plixxer 2016 년

클래스의 인스턴스가 아닌 실제 클래스를 내보낼 수 있습니다. 그렇게하면 정적 메소드를 사용할 수 있습니다. 그런 다음 인스턴스 메소드를 사용해야하는 경우 컨트롤러에서 클래스를 인스턴스화해야합니다.
m.spyratos 2016 년

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

app.js에서 수정되지 않았습니다.

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

1
기능 표시 줄에서 this.foo ()가 작동하지 않습니다 ... foo ()
여야합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.