2016-08-29 5 views
1

私はNodeJSを使用しています。私たちがブラウザで行うように、ノードにjavascriptファイルを必要とすることは可能ですか? require()メソッドを使用するとjavascriptファイルが呼び出されるため、server.js内のグローバル変数にアクセスすることができないため、「use strict」のようになります。私のモジュールはいくつかのグローバル変数に依存しているので、モジュールをロードしてメインファイルの続きにする必要がありました。NodeJsファイルが必要です

編集:私はこのserver.jsファイル持って

:ここ

var Settings = require("settings.js"); 
var Clients = require("clients.js"); 
var removePack = []; 

/**HERE RUNS MY WEBSOCKET SERVER**/ 
... 
... 
//When a new socket connects: 
io.on("connection", function(socket){ 
    var socket.id = Math.random(); 
    var client = Clients.create(socket.id); 
}); 

を私clients.jsファイル:

exports.create = function(){ 
    self.team = Settings.generateRandomTeam(); /*The problem is here. I can´t access the Settings variable*/ 
    self.maxSpeed = Settings.maxSpeed; 
    ... 
    ... 
    return self; 
} 

EDIT 2:

設定を使用すると= require( "settings.js")次のエラーが表示されます。

TypeError:Settings.generateRandomTeam()は関数ではありません。

Settings.generateRandomTeam = function(){ 
    //Some code 
} 

module.exports = Settings; 

ありがとう:

私settings.jsファイルはこのようなものです!

+1

あなたは単に 'var foo = require( 'foo.js');'を実行します。あなたがアクセスしたいものをエクスポートすることを確認してください – Li357

+0

正しいパスを使用してください! 'var foo = require( 'foo.js');'のようなファイルが必要な場合 - これはあなたのコンピュータ上にグローバルモジュールを必要としています。 'var foo = require( './ foo.js');' – James111

+3

まず、node.jsでは、グローバル変数(99.9999%またはそれが必要でないか適切でない時)を使うことについて考えることはありません。 node.jsのモジュールがどのように動作するか、モジュール間でデータを共有する方法を学ぶ必要があります。ヒント:グローバルを使うことはnode.jsでやる方法ではありません。プッシュまたはプルモデルを使用して共有することができます。最も単純な方法は、モジュールコンストラクタを呼び出して、共有するデータを他のモジュールにプッシュしているため、共有するデータを「プッシュ」モデルと呼ぶことです。 – jfriend00

答えて

1

ちょうどあなたclients.jsファイルにこれを追加し、clients.jsファイルからSettingsオブジェクトへのアクセスを取得するには、次のNode.jsのモジュールがまったく同じファイルパスに解決するので、2つrequire()文がキャッシュされている

const Settings = require("settings.js"); 

exports.create = function(){ 
    self.team = Settings.generateRandomTeam(); /*The problem is here. I can´t access the Settings variable*/ 
    self.maxSpeed = Settings.maxSpeed; 
    ... 
    ... 
    return self; 
} 

まったく同じキャッシュモジュールを返します。したがって、キャッシングのために、require("settings.js")を呼び出すたびに、実際には同じSettingsオブジェクトが取得されます。

これはnode.jsで共有するための鍵です。あなたは一度何かを読み込んでそれをどこにでも共有しようとは考えていません。代わりに、それぞれのモジュールを必要に応じて(可能であれば)入れておくことを考えます。これはモジュールの独立性と再利用性を促進します。モジュールはすでに構築されているいくつかの地球環境に依存するよりも、スタンドアロンの方が便利な傾向があります。

もちろん、モジュールコンストラクタ関数内のモジュールにデータをプッシュしたり、モジュールをロードして他のモジュールからデータを取得してデータを取得したりすることで、データを共有する方法もあります。これは、モジュールが(データベースハンドルのような)特定のインスタンスを与える必要がある場合に必要な場合があります。

+0

@DanielOliveira - 'settings.js'はどこですか? 'clients.js'と同じディレクトリにある場合は、' require( './ settings.js') 'でロードします。 – jfriend00

+0

これはルートディレクトリにありません。 –

+0

しかし、ファイルclients.jsをsettings.jsファイルに含める必要がありました。また、settings.jsはclient.jsファイルにも含まれています。両方ともお互いに依存しているからです。これは無限の必要ループを作成し、おそらくこの問題を作成していますか? –

関連する問題