2016-07-03 9 views
13

せずに必要と使い方:私は理解していない私は、オンラインリソースから借りてきた(完璧に動作します)このコードを持って輸出

var express = require('express'); 
var bodyParser = require('body-parser'); 
var logger = require('morgan'); 

var app = express(); 

require('./init/db'); 
require('./init/cache'); //Bring in Redis 

//Define Routes 
var userRoutes = require('./routes/user'); 

module.exports = app; 

ビットは、このように使用する場合、「必要」であります?

//db.js 
var mongoose = require('mongoose'); 
var dbURI = <theURI>; 

mongoose.connect(dbURI); 

// CONNECTION EVENTS 
mongoose.connection.on('connected', function() { 
    console.log('Mongoose connected successfully'); 
}); 

それは私のRedisの接続と同じです::

//cache.js 
var redis = require("redis"); 

var redisClient = redis.createClient(process.env.CACHE_PORT, process.env.CACHE_URL); 
redisClient.auth(process.env.CACHE_PASS); 

redisClient.on("ready", function() { 
    console.log("Cache is connected"); 
}); 

しかしdb.jsまたはcache.jsファイルでno module.exportsどこにでもありますあなたが見ることができるようにここではそれがもたらすファイルがあります!私はこれをどのように動作するのか理解するためにこれをgoogleすると、常にmodule.exportsrequireについて話しています。

質問

  1. は、誰かがこのように単独で使用する場合作業を必要と方法を説明してもらえますか?それはのようなものを使用して、私のuserRoutesファイルで使用できるように、私はキャッシュ/ Redisの接続が利用できるようにするにはどうすればよい

  2. var userRoutes = require('./routes/user')(redis);

+0

あなたは間違いなく、DBへの参照として他のモジュールで使用するためにマングース接続をエクスポートすることができます。ちょうどGoogleのそれ(例:輸出mongoose接続)と多くの例が見つかります。 –

+0

私のコードは正常に動作していると私は私のルートファイルからデータベースを照会することができますが、私はどのように理解していません! – tommyd456

+0

優秀な質問!尋ねていただきありがとうございます。それは私が多くの事を理解し、私の仕事を完了するのを助けました! – kirtan403

答えて

24

誰かがこのコードで何が起こっているかを説明してもらえますか?言い換えれば、どのように輸出に使用されていないときに動作する必要があります。

ほとんどの場合、require()module.exportsと一緒に使用されていますが、そうする必要はありません。何もエクスポートしないと、インポートされたモジュールのコードは引き続き実行されますが、インポートに変数をバインドして相互作用することはできません。私はそうのように、私のメインのファイルにこのモジュールをインポートすることができ

var foo = {}; 

foo.greet = function(){ 
    console.log('Hello from Foo!'); 
} 

foo.greet(); 

は、次のFoo.jsモジュールを考えてみましょう

require('./foo'); 

私は、このメインファイル、Foo.jsモジュール内のコードを実行した場合実行され、こんにちはからFoo!がコンソールに印刷されます。

しかし、私はfooオブジェクトと直接対話できません。

require('./foo'); 
foo.greet(); //ReferenceError, foo is not defined 

私は変数にモジュールのインポートをバインドすることができますが、でもこれは動作しません:次のコードは動作しません

var foo = require('./foo'); 
foo.greet(); //TypeError, foo.greet is not a function 

はそれが仕事を得るために、私がfooをエクスポートする必要がありますあなたがよく知っているmodule.exportsを使用して、私のモジュールのオブジェクト

これは、インポートされたモジュールを変数にバインドする必要がない場合と同じように、モジュールから何かをエクスポートする必要がないことを示しています。違いは、あなたがそのモジュールに見えるようにしたくないものをエクスポートしない場合は、インポートされたモジュールのコードと対話することはできないということです。あなたの質問のコードで

は、そのモジュールは、自己完結型であるため、Redisの作品インポート、あなたはあなたのコードでそれと対話する必要はありません。実行できるようにコードをインポートするだけです(メインのRedisモジュールが必要で、クライアントを作成する必要があります)

+0

ありがとう、これは本当に役に立ちます。 Redisの部分に関しては、私の 'userRoutes'ファイルで' redisClient'を利用できるようにする必要があります。 'cache.js'ファイルの最後に' module.exports = redisClient'を追加するのは簡単なのでしょうか? – tommyd456

+0

あなたは 'redisClient'をエクスポートして、変数に' require'をバインドする場合は、[はい、あなたはこのような偉大な答えは、その変数 – Drown

+0

経由でアクセスできるようになります!私は1つのファイルから2つのアプリケーションを処理した後、このようなことを探していました。素晴らしいもの!そしてすばらしい質問! – kirtan403

2

requireを呼び出すと、モジュールがロードされて実行されます。あなたは接続されたマングースを持っています。実際にrequireは、あなたのモジュール全体のコードがそこに注入され、最後に実行される機能を作ります。

あなたはモジュールで作成した変数を再利用したい場合は、[いいえ、あなたはそれをエクスポートする必要があります。同様:モジュールは、モジュールが必要なファイルにアクセスできるグローバルスコープ内の変数を定義するため

//cache.js 
var redis = require("redis"); 

var redisClient = redis.createClient(process.env.CACHE_PORT, process.env.CACHE_URL); 
redisClient.auth(process.env.CACHE_PASS); 

redisClient.on("ready", function() { 
    console.log("Cache is connected"); 
}); 

module.exports = redisClient; 
+0

ありがとう、私はちょうどこれと同じ他の答えのコメントを追加しました。とにかく乾杯。 – tommyd456

0

輸出がそれを実行するために含まれていないモジュールを必要とするほかます副作用ことも可能です。これは、varキーワードなしで変数を定義することによって発生します。それは良いまたは一般的な練習ではありませんが、あなたはどこかでそれに遭遇するかもしれないので、何が起こっているのか知ることは良いです。

例:

// foo.js 
bar = 5; 

そして

// test.js 
require('./foo'); 

console.log(bar); 
// prints 5 

barは次のように定義された場合は、次の

var bar = 5; 

それはモジュールのスコープ内にあるとtest.jsにアクセスできないでしょう。

関連する問題