2016-07-03 5 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"); 
}); 

, но как вы можете видеть, что нет module.exports нигде в db.js или cache.js файлов! Когда я google это, чтобы понять, как это работает, примеры всегда говорят о module.exports и require вместе.

Вопросы

  1. Может кто-нибудь объяснить, как требует работы, когда используется самостоятельно, как это?

  2. Как я могу сделать кэш/соединение Redis доступны, так что он может быть использован в моем userRoutes файл, используя что-то вроде: var userRoutes = require('./routes/user')(redis);

+0

Вы можете определенно экспортировать соединение mongoose для использования в других модулях в качестве ссылки на БД. Просто Google это (например: экспорт mongoose соединение), и вы найдете множество примеров. –

+0

Мой код работает нормально, и я могу запросить базу данных из файла маршрутов, но я не понимаю, как это сделать! – tommyd456

+0

Отличный вопрос! Спасибо за вопрос. Это помогло мне понять многое и сделать мою работу! – kirtan403

ответ

24

Может кто-нибудь объяснить, что происходит с этим кодом? Другими словами, как требуется работа, когда она не используется с экспортом.

Мы почти всегда видим, что require() используется с module.exports, но вам не обязательно. Когда вы ничего не экспортируете, код в импортированном модуле все равно будет работать, но вы не можете привязать импорт к переменной и взаимодействовать с ним.

Рассмотрим следующий Foo.js модуль:

var foo = {}; 

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

foo.greet(); 

я могу импортировать этот модуль в своем главном файле, например, так:

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, мне нужно сделать 'redisClient' доступным в моем файле userRoutes. Является ли простой пример добавления 'module.exports = redisClient' в нижней части файла' cache.js'? – tommyd456

+0

Да, если вы экспортируете 'redisClient' и привяжите' require' к переменной, тогда вы сможете получить к ней доступ через эту переменную – Drown

+0

Это такой отличный ответ! Я искал что-то вроде этого через день после того, как мои 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.

Смежные вопросы