Node.js: Конфигурация и маршруты в другом файле

Я запускаю новое приложение Node.js, и на этот раз я пытаюсь правильно организовать код, а не все в одном файле.

У меня только простая настройка теперь на server.coffee:

express = require 'express'
app = module.exports = express.createServer()

## CONFIGURATION ##

app.configure () ->
 app.set 'views', __dirname + '/views'
 app.set 'view engine', 'jade'
 app.use express.bodyParser()
 app.use express.logger('dev')
 app.use express.profiler()
 app.use express.methodOverride()
 app.use app.router
 app.use express.static(__dirname + '/public')

app.configure 'development', () ->
 app.use express.errorHandler({dumpExceptions: true, showStack: true})

app.configure 'production', () ->
 app.use express.errorHandler()

app.get '/', (req,res) ->
  res.render 'index'
    title: 'Express'

## SERVER ##
port = process.env.PORT || 3000 

app.listen port, () ->
  console.log "Listening on port" + port

У меня есть некоторые вопросы относительно этого простого кода, и я знаю, что все ответы зависят от разработчика, но я действительно хочу сделать это правильно:

  • Если файл server.js имеет больше, чем app.listen? Что должно быть там точно?
  • Должны ли все конфигурации быть в другом файле, кроме маршрутов? Как удалить app.get в другой файл и заставить их работать при запуске server.coffee?
  • Что именно должно содержать index.coffee, которое я вижу во многих приложениях, таких как Hubot?

Я надеюсь, что кто-то может дать мне ответ, отличный от "это зависит".

Ответы

Ответ 1

Вы можете использовать require и просто передать app var in в качестве параметра для метода. Это не самый симпатичный синтаксис, и не в CoffeeScript, но вы должны получить эту идею.

routes.js

module.exports = function (app) {
    // set up the routes themselves
    app.get("/", function (req, res) {
        // do stuff
    });
};

app.js

require("./routes")(app);

Если вы хотите сделать это еще дальше, я разделяю маршруты на более мелкие группы и в свою собственную подпапку. (например: routes/auth.js для входа/выхода из системы, routes/main.js для дома/около/контакта и т.д.)

маршруты /index.js

// export a function that accepts `app` as a param
module.exports = function (app) {
    require("./main")(app);
    // add new lines for each other module, or use an array with a forEach
};

(переименуйте routes.js из ранее как routes/main.js, сам источник остается тем же)

Ответ 2

Экспресс 4 упрощает это с помощью класса express.Router.

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

В следующем примере создается маршрутизатор как модуль, загружается в него промежуточное программное обеспечение, определяется несколько маршрутов и монтируется по пути в главном приложении.

Создайте файл роутера с именем birds.js в каталоге приложения со следующим содержимым:

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

// middleware specific to this router
router.use(function timeLog(req, res, next) {
  console.log('Time: ', Date.now());
  next();
});

// define the home page route
router.get('/', function(req, res) {
  res.send('Birds home page');
});

// define the about route
router.get('/about', function(req, res) {
  res.send('About birds');
});

module.exports = router;

Затем загрузите модуль маршрутизатора в приложение:

var birds = require('./birds');
app.use('/birds', birds);

Теперь приложение сможет обрабатывать запросы /birds и /birds/about, а также ссылаться на связывание timeLog, специфичное для маршрута.