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
, специфичное для маршрута.
Ответ 3
Есть два похожих вопроса, которые могут помочь вам в этом:
Как структурировать приложение express.js?
Структура приложения Nodejs/Expressjs