2015-08-07 2 views
2

app.js У меня есть с помощью следующего кода, и я имею дополнительный файл, который называется router.js, которые обрабатывают запрос такого поста/чтение/и т.д.проходят PARAMS от app.js к route.js

это приложение .js

var express = require('express'); 
    module.exports = function() { 
      var app = express(); 
      .... 
      require('./router/routes')(app, express); 
      return app; 
     }; 

The router.js это выглядит следующим образом

*/

module.exports = function (app, express) { 

    var appRouter = express.Router(); 
    app.use(appRouter); 
    appRouter.route('*') 
.post(function (req, res) { 

      handler.dispatch(req, res); 
     }) 
     .get(function (req, res) { 
      handelr.dispatch(req, res) 
     }) 

Есть хороший способ избежать передачи двух параметров (приложение, экспресс)?

ответ

0

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

app.js

var express = require('express'); 
var app = express(); 
module.exports = app; 

app.boot = function() { 
    // require in middleware, routes, etc, then start listening. 
    require('./middleware'); 
    require('./routes'); 
    // middleware that comes after routes, such as error handling 
    require('./middleware/after'); 
    app.listen(); 
} 
if (require.main === module) { 
    //move execution to next tick so we can require app.js in other modules safely 
    process.nextTick(app.boot); 
} 

routes.js

var express = require('express'); 
var app = require('./app'); 
var appRouter = express.Router(); 
app.use(appRouter); 
appRouter.route('*'); 
appRouter.get('/foo', function() {...}); 
appRouter.post('/foo', function() {...}); 
module.exports = appRouter; // for unit testing, or you can use this to attach it in app.js instead. 

Кроме того, путем присоединения функцию загрузки к app, теперь вы можете включить это приложение в другой экспресс приложения и при необходимости присоединить его к маршрутизатору, не изменяя ничего. Все, что вам нужно будет сделать, это выполнить его, подключить, а затем выполнить app.boot, чтобы подключить необходимое промежуточное ПО/маршруты. (полезно для модульных испытаний)

+0

Спасибо, я хочу попробовать, но в app.js Ive addinal логики, где я должен поставить его? логика, например app.set («порт», process.env.PORT || 3000); app.set ('production', process.env.NODE_ENV == 'production'); app.use (logger ('dev')); ..... –

+0

@Mark это зависит. Если это необходимо для выполнения перед промежуточным программным обеспечением и маршрутами, то это невозможно. –

+0

Хорошо спасибо в маршрутизаторе после маршрута, у меня есть метод post/get, где я должен сейчас их ставить? (см. мое обновление с помощью нового метода), можете ли вы представить пример, который скомпрометирован, потому что я немного путаюсь ... Спасибо, сэр! –

1

Нет никакого «хорошего» способа избавиться от прохождения app. express вы можете «избежать», просто добавив var express = require('express'); в начало скрипта.

Другой вариант - вместо этого экспортировать маршрутизатор и установить его в родительском скрипте. Например:

router.js:

var appRouter = require('express').Router(); 
appRouter.route('*') 
// ... 

module.exports = appRouter; 

app.js:

var router = require('./router'); 
var app = require('express')(); 
app.use(router); 
1

Вам не нужно проходить express, потому что вы можете просто требовать его в routes.js без каких-либо дополнительных накладных расходов (Вы уже требуют в app.js, так что все, что вы получаете, является ссылкой на тот же объект).

Кроме того, вашему маршрутизатору не нужно знать о приложении. На самом деле, имеет смысл вернуть маршрутизатор из вашего routes.js и использовать его с app.js. Это называется «разделение проблем»; app.js обрабатывает создание и модификацию app, а routes.js обрабатывает создание и изменение маршрутов.

приложение.JS

var express = require('express'); 
var routes = require('./router/routes'); 

module.exports = function() { 
    var app = express(); 
    app.use(routes); 
    return app; 
}; 

router.js

var express = require('express'); 

module.exports = function() { 
    var appRouter = express.Router(); 
    appRouter.route('*') 
    return appRouter; 
}; 
+0

Спасибо, я пробую то, что вы предлагаете, и его не останавливает в сообщении или не получает метод ... любая идея, как принять его, что это работает? До того, как это сработает (см. Обновление в моем вопросе с помощью метода, который я добавил) –

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