2015-12-25 16 views
1

В настоящее время я занимаюсь разработкой веб-сайта, использующего множество маршрутов. В начале все маршруты были реализованы в одном файле ... Чтобы сделать все более ясным, я решил создать несколько файлов, чтобы отделить маршруты ... с помощью модуля Router.Node Express.js переменные доступа из маршрутов, объявленных в отдельных файлах

Например, в моем users.js файл у меня есть:

var express = require('express'); 
var router = express.Router(); 

router.get('/', function(req, res, next) { 
    res.send('respond with a resource'); 
}); 

module.exports = router; 

и в моем главном app.js файле:

app.use('/users', require('./routes/user'); 

Это прекрасно работает, но дело в том, что я хотел мой «пользовательский» маршрут для доступа к некоторым переменным, которые были объявлены в файле app.js, до app.use(...)

Я знаю, что могу использовать require и module.exports, но некоторые переменные должны быть объявлены в моем приложении app.js только один раз, и я должен получить к ним доступ из маршрутов, которые я включаю.

ответ

2

Вы можете передать их как объект конфигурации. Также измените свой маршрут, на функцию, которая возвращает маршрут, таким образом, он может принимать параметры.

module.exports = function (options) { 
    return function (req, res, next) { 
    // do your thing 
    // you have access to options variable as well 
    } 
} 

И в вашем основном JS-файле требуется файл и назовите его и передайте все, что вам нужно.

app.use('/users', require('./routes/user')({ 
    option1: 'value1', 
    option2: 'value2' 
})); 

Для таких вещей, как подключение к базе данных, ваши модели и другим сторонних библиотеки, вам не нужно, чтобы передать их в качестве объекта конфигурации. Рекомендуется также переместить их в внешние файлы и require их в файл ваших маршрутов. Вам нужно отделить столько, сколько вы можете.

Просто помните, что require будет загружать каждый модуль один раз, в остальное время он просто возвращает ссылку на ранее загруженный модуль. Взгляните на this question для получения дополнительной информации.

+0

Кажется, это хорошая идея, но у меня есть много вещей, которые можно получить со всех моих маршрутов. Например, поскольку все они должны получить доступ к моей базе данных mongo, все они должны получить доступ к моим «схемам Mongoose», которые я определил в основном файле app.js. Вы говорите, что я должен отправлять все эти переменные через каждую функцию 'app.use()'? Это не очень удобно, что вы думаете? – FrenchFalcon

+0

@MalteseFalcon Ну, я считаю, вам нужно рассмотреть некоторые изменения в структуре вашего проекта. Если у вас есть маршруты во внешних файлах, зачем хранить Mongoose Schemas внутри основного файла? перемещайте их и в внешние файлы, и требуйте их в файлах маршрутов.Я обновлю свой ответ, чтобы освежить это для будущих посетителей :) –

+0

Да, вот почему я на самом деле пытаюсь это сделать. Но, требуя несколько раз, эти схемы вызывают у меня некоторые ошибки ... Это как я могу объявить их только один раз ... – FrenchFalcon

1

Для более глобального доступа, вы сделаете переменные, которые вы хотите поделиться пример global.For

//app.js 
GLOBAL.config = {} 

Лучше всего использовать отдельный файл для вас приложения конфигурации. Например

//config.js 
module.exports = {logging:true} 

и сделать его глобальной переменной в вашем файле app.js, как следовать

//app.js 
GLOBAL.config = require('./config'); 

Теперь он будет доступен в вашем определении маршрутизации. Например,

//routes/users.js 
router.get('/', function(req, res, next) { 
    if(config.logAccess){ 
     var accessTime = new Date(); 
    console.log('access at '+accessTime.toTimeString()); 
    } 
    res.send('respond with a resource'); 
}); 
Смежные вопросы