module.exports内の別の関数からmodule.exports内の「ローカル」関数を呼び出しますか?


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

}

私は関数foo内から関数にアクセスしようとしていますbar、そして私は得ています:

TypeError:オブジェクト#にはメソッド 'foo'がありません

私が得るthis.foo()だけに変更した場合foo()

ReferenceError:fooが定義されていません


4
コードをテストしましたが、エラーはありませんでした。return関数がないため、bar関数はundefinedを返します。正しくテストしていますか?
Ferchi、2014年

1
ノードバージョンでテストされv8.12.0、エラーをスローしなくなりました。barにはreturnステートメントがないため、実行するconsole.log(bla.bar())と単に返されますundefined
VladNeacsu

回答:


351

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


1
@NamNguyen Calling exports.foo()は少し厄介で読みにくいようです。
Afshin Mehrabani 2014

4
これは受け入れられた答えよりも優れていると思います。あなたが外に輸出スコープの機能を定義した場合、それは間接の余分なレベルを追加し、それが望ましい時々することができますが、それは、それがより複雑になりリファクタリングに、例えば名前の変更機能などの機能の発見の利用、の
ピエールヘンリー

1
質問への直接的な回答
Kermit_ice_tea 2016

8
module.exports.foo()そして、exports.foo()のNode.jsのv5.8.0と私のために動作しません。
16

14
exports.foo()は機能していませんが、module.exports.foo()はNodeJS v6.9.1で機能しています
R. Canser

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 2016

1
TypeErrorを取得しています:これを行ったとき、yourClass.youMethodは関数ではありません。ノードバージョン6.9.1を使用しています。returnステートメントが必要ですか?すべてのコードが関数内で非同期であるため、returnステートメントはありません。
Brett Mathe 16

1
異なるスタイルの優れた
Tadas V.

とても素晴らしい実装です!+1
realnsleo 2018

3
または、より簡潔ES6、使用してmodule.exports = { foo, bar, }
それについてレッツミーティンクを

118

これを行うと、より簡潔で読みやすくなります。これは、よく書かれたオープンソースモジュールのいくつかで私が見たものです。

var self = module.exports = {

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

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

}

このNode.jsのバージョンは固有ですか?私はこれをv5.8.0で試していますが、ログが未定義です。
16

1
@doublejosh Did ...質問を読みましたか?エクスポートされた関数を別の関数から呼び出す方法を尋ねています。アクセス制限とは関係ありません
モニカの訴訟に資金を

1
はい、読みました。もう一度お読みください。この答えはfoo()をモジュールとともにエクスポートします。これは、モジュール内でのみ呼び出される「ローカル」関数のポイントに反します。
doublejosh

66

(module。)exports.somemodule定義の外にあるモジュールのグローバルスコープへの参照を保存することもできます。

var _this = this;

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

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

よりクリーンなソリューションです!
IvanZh 2014

_thisは必要なく、必要な場所で使用できます
Yuki

this直接使用、宣言する必要はありません_this
Darius

1
この提案は、かつてthis適切でなくなったときに有用ですthis。(約束と
折り返し電話

NodeJSモジュールでのスコープの例も示されているため、このソリューションが最も気に入っています。
ミゲルモリン

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()同じ名前で呼び出されるため、これは特に便利です。
Vince Bowdren 2018年

これは完璧な答えです!
Jayant Varshney、2018

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

Nodeのモジュールキャッシュにより、これはクラスを1回だけインスタンス化します:https :
//nodejs.org/api/modules.html#modules_caching


そしてこの方法で静的メソッドをどのように呼び出すのですか?
Plixxer

@CodeofGod他の静的メソッドを呼び出すのと同じように呼び出すだけです。この場合、foo静的だったあなたは内側からそれを呼び出しますbar。このように:MyClass.foo()
m.spyratos

ええ、それはわかりますが、次のようにそれをインポートしているコントローラーからどのように呼び出しますか?const oAccounts = require( "...");
Plixxer 2018年

クラスのインスタンスではなく、実際のクラスをエクスポートできます。そうすれば、静的メソッドを使用できます。ただし、そのインスタンスメソッドを使用する必要がある場合は、コントローラーでクラスをインスタンス化する必要があります。
m.spyratos

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()である必要があります
Falcoa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.