Как получить доступ к переменным, объявленным в основных файлах 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');});
}