2017-10-11 4 views
0

対Iのようなエクスポートモジュール間の差異を理解する問題を抱えていNodeJSは、module.exports.Xはmodule.exportsは= {X}

function getUserIP(req) { 
    // retrieve user IP from req object 
    // Build this function to be more accurate/use more sources. 
    var ip = req.headers['x-forwarded-for']; 
    return ip; 
} 

及び下部にエクスポート:

module.exports = { getUserIP } 

あるいは:

module.exports = {getUserIP:getUserIP} 

または

module.exports = {'getUserIP':getUserIP} 

私の問題がある:私は別のファイルからgetUserIP関数を呼び出すとき:とき、しかし Error Message

var mainbody = require('./app.js');//getUserIP is in here. 
const gl = require('geoip-lite'); 
var ax = require('axios'); 

module.exports.getloc = function getloc(req, ip, property) { 
    //return location from IP. 
    if (req) { 
     var ipGuest = mainbody.getUserIP(req); //HERE 
    } else { 
     var ipGuest = ip; 
    }.... 

私はエラーメッセージが表示されますFIRSTメソッドを使用して関数をエクスポートします。

module.exports.getUserIP = function getUserIP(req) { 
    var ip = req.headers['x-forwarded-for']; 
    return ip; 
} 

それは完全に動作します。

違いは何ですか?

+0

app.jsから複数の同様の機能をエクスポートしていますか?はいの場合は、2回目のメソッドを使用するたびにエクスポートオブジェクト全体を上書きします。 – paolord

+0

私はそうではありません。私は各ファイルの一番下にmodule.exports = {}を1つだけ持っています。 他の関数は機能しますが、何らかの理由で他の関数と同じようにエクスポートされません。 これは動作しますが、下部に8つのクラスをエクスポートし、コードに1つのクラスをインラインでエクスポートするだけで邪魔になります。 –

答えて

0

良い方法は

module.exports = { getUserIP: getUserIP }

にこの方法を使用することですあなたは自分のファイルの末尾に輸出の文を見て、特定のファイルからエクスポートされている機能を知ることができます

module.exports = {getUserIP};は、上記の構文(ES6 Magic)の短縮形に過ぎません。通常は、{ getUserIP: getUserIP }のようにキー名が{ getUserIP: getUserIP }の場合、{ getUserIP }と書くことができます。ここで、getUserIPは変数または関数またはES6クラスになります。

1

あなたが表示するすべての例は正しく動作しますが、いくつかの異なる影響があります。

デフォルトでは、module.exportsはすでに空のオブジェクトに初期化されています。あなたはこのような何かときに、:

module.exports.getUserIP = function() {...} 

をすでに指さmodule.exportsは既存のオブジェクトに新しいプロパティを割り当てています。このスキームの利点の1つは、同じ方法で複数のプロパティを簡単に追加できることです。

module.exports.getUserRegion = function() {} 

これは、既に追加した最初のものを妨害することなく、同じオブジェクトにもう1つのプロパティを追加します。一方


、これらのすべては同じです:

module.exports = {getUserIP: getUserIP} 
module.exports = {'getUserIP':getUserIP} 
module.exports = { getUserIP } // ES6 shorthand for the previous syntax 

と、それらはすべて、それぞれ他のと同じ結果に終わる、それらはすべての新しいオブジェクトにmodule.exportsはを置き換えますあなたの新しい財産が1つあります。

module.exports = {getUserRegion}; 

再びmodule.exportsに全く新しいオブジェクトを割り当ててしまうと、あなただけの以前にそれにgetUserIPを持っていたオブジェクトを一掃しているだろう:あなたはその後、別のプロパティを追加しようとした場合

。あなたはすでにそこに入れていた何かを拭いていない、したがって

module.exports = {getUserIP: function() {...}, getUserRegion: function() {...}}; 

:新しいオブジェクトを割り当てる場合、あなたは一般的にそれにすべてのあなたの特性を持っていたオブジェクトを割り当てます。


あなたのスキームのすべては、限り、あなたは新しいオブジェクトにmodule.exportsを上書きするため、すでにそこにあなたの方法のいくつかを持っていたオブジェクトを上書きしていないと正常に動作する必要があります。

+0

私はモジュールを上書きしているとは思わない。元の交換以外の最終的な結果には根本的な違いはありません - module.exports.functionX = functionX そしてmodule.exportsは= {functionX、functionY、functionZ} –

+0

@ManojKumar:私の間にいくつかの基本的な違いがあると思います'module.exports'オブジェクトを新しいオブジェクトで置き換えます。誰も元のオブジェクトを使用したことがないなら、それは全く問題ではありません。どちらにしてもかまいません。あなたが働くものを持っていて、他のものがそうでないものを持っているなら、あなたが私たちに問題を引き起こしていることを示していない何かが続いています。私たちは問題の原因となるACTUALコード(全体として)を見る必要があります。 – jfriend00

0

このエクスポートモジュールの概念を理解するには、module.exportが単純なオブジェクトだと思ってください。通常のjavascriptオブジェクトと同様に、そのオブジェクトに何かをバインドすることができます。
最後にそのモジュールをrequire('path to js')で要求すると、そのエクスポートされたオブジェクトが取得されます。モジュール内のアイテムの数をエクスポートすると、タグの名前を返すことでそれらを戻すことができます。