Как получить доступ к переменным, объявленным в основных файлах app.js, в отдельных файлах маршрута в node.js Express 2.5.5?

Я только начал использовать новую версию Express (2.5.5), которая по умолчанию создает каталог ./routes вместе с ./views и ./public

Внутри маршрутов есть файл index.js, который содержит:

/*
 * GET home page.
 */

exports.index = function(req, res){
  res.render('index', { title: 'Express' })
};

по умолчанию (после запуска express из командной строки), и это раздел маршрутов в главном app.js:

// Routes

app.get('/', routes.index);

Я установил переменную для клиента redis в главном app.js:

var redis = require('redis'),
    db = redis.createClient();

и мне было интересно, как я могу получить доступ к методам db (и любых других модулей я require в app.js) в файлах, содержащихся в ./routes

Ответ 1

Мне очень понравилось решение Jamund, но я бы расширил концепцию до этого:

// db.js
var redis = require('redis');
module.exports = redis.createClient();

// index.js
var db = require(.'/db')

// whatever other file
var db = require(.'/db')
// do something with db
db.disconnect();

и db в индексе, и в другом файле получит тот же экземпляр клиента redis

Ответ 2

Просто назовите это в верхней части своих файлов. Требования находятся в общем пространстве, поэтому вы можете повторно потребовать файл несколько раз, и он всегда будет ссылаться на ту же версию. Если вы хотите быть фантазией, вы можете создать свой собственный модуль db, который сделает что-то вроде этого, чтобы предотвратить создание двойных клиентов:

// db.js
var db 
var redis = require('redis')
exports.connect = function() {
  if (!db) db = redis.createClient()
  return db
}

exports.disconnect = function() {
  redis.quit()
  db = null
}


// index.js
var dbHelper = require(.'/db')
var db = dbHelper.connect()

// whatever other file
var dbHelper = require(.'/db')
var db = dbHelper.connect() // won't connect twice

Ответ 3

Вы можете либо создать глобальное приложение, либо повесить vars, который вы хотите отключить, или вы можете использовать функцию инициализации в файле маршрутов

f.e.

// app.js

var app = express.createServer()
  , db = require('redis').createClient();

require('./routes').with(app, db);

// routes.js
module.exports.with = function(app, db) {
  app.get('/',function(r,s) { s.end('Sweet');});
}