2016-11-27 2 views
1

Я занимаюсь с NodeJS и Express в течение нескольких дней, и это довольно круто. Но я столкнулся с проблемой, с которой я не могу разобраться, поэтому я надеюсь, что кто-то другой может помочь мне разобраться в этом.ExpressJS - модуль маршрутизатора с параметрами

Я знаю, что могу объявить модуль, а затем передать параметры в этот модуль с помощью метода require.

--- App.js ---- 
var foo = require('./modules/Foo.js'); 
    foo.config(); 
var bar= {} 
    require('./modules/Bar.js)(bar, foo) 

--- Bar.js --- 
module.exports = function(Bar, Foo) { 
    Bar.act = function(){ 
      Foo.do(); 
    } 
} 

Я думаю, что это гораздо более чистый дизайн, чем того, чтобы требовать Foo в каждом модуле, который потребует его использования. Мне также не нужно выполнять инициализацию в каждом модуле, который этого требует.

Но затем приходит Router, и я не могу понять, как это работает. Большинство примеров там требуется маршрутизатор в каждом модуле, что-то вроде этого:

--- App.js ---- 
var index = require('./views/index.js'); 
app.use('/', index); 

--- Index.js --- 
var express = require('express'); 
var router = express.Router(); 
var foo = require('../modules/Foo.js); 

foo.config(); 

router.get('/', function (req, res) { 
    foo.do(); 
    res.render('index'); 
}) 

module.exports = router 

Но тогда, мне нужно требовать, чтобы все модули, используемые в index.js вручную. То, что я действительно хотел бы сделать что-то вроде этого:

--- App.js ---- 
var foo = require('../modules/Foo.js); 
    foo.config(); 
var index = require('./views/index.js')(foo); 
app.use('/', index); 

--- Index.js --- 
var express = require('express'); 
var router = express.Router(); 

module.exports = function(foo){ 
    router.get('/', function (req, res) { 
     foo.do(); 
     res.render('index'); 
    }) 
} 

Но писать об этом так, компилятор говорит мне «Router.use() требует промежуточного ПО, получил неопределенный». Я могу посмотреть, откуда эта ошибка, (module.exports не возвращает объект), но так как я могу структурировать свой код, чтобы передать параметры модулю, который в конце будет экспортировать промежуточное программное обеспечение маршрутизатора? Я хочу потребовать и инициализировать Foo в одном месте, а затем передать его всем модулям маршрутизатора, которые его используют. Возможно ли это как-то?

ответ

1

Вы почти получили его, вам просто нужно вернуть Router.

Фиксированный index.js может выглядеть следующим образом:

var express = require('express'); 

module.exports = function(foo){ 
    var router = express.Router(); 

    router.get('/', function (req, res) { 
     foo.do(); 
     res.render('index'); 
    }); 

    return router; 
} 

Обратите внимание на дополнительные ; и возврата.

Я также перенес настройку маршрутизатора на функцию. В модулях узла cached вы можете потребовать один и тот же модуль несколько раз, и все они будут разделять свои глобальные переменные. Это может привести к неожиданным результатам. В вашем случае вы будете перезаписывать обработчик router.get каждый раз, и тот же экземпляр Foo будет использоваться для каждого запроса.

+1

Это сработало. Большое спасибо ^. ^ – Gikkman

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