Как вы модулируете Node.JS w/Express

Я пытаюсь модулировать мое приложение node.js(используя экспресс-фреймворк). Проблема, с которой я столкнулась, - это настроить мои маршруты.

Я больше не могу извлечь данные, которые я отправляю в сообщение. (req.body - undefined). Это работает нормально, если все в одном файле. Что я делаю неправильно здесь, и что является лучшим способом модульного кода в node.js?

My app.js

require('./routes.js').setRoutes(app);

Мой route.js

exports.setRoutes = function(app){

  app.post('/ask', function(req, res, next){
    time = new Date();

    var newQuestion = {title: req.body.title, time: time.getTime(), vote:1};
    app.questions.push(newQuestion);
    res.render('index', {
      locals: {
        title: 'Questions',
        questions: app.questions
      }
    });
});

Ответы

Ответ 1

Лучший подход:

Создайте файл route.js, который содержит:

var index = require('./controllers/index');

module.exports = function(app) {
  app.all('/', index.index);
}

Затем, с вашего сервера server.js(или, тем не менее, вы запустили свой сервер), вам потребуется его как таковое:

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

Таким образом, вы не создаете глобальные переменные, которые приносят с собой целую массу проблем (тестируемость, столкновение и т.д.).

Ответ 2

Я понимаю, что кто-то уже ответил, но вот что я делаю в любом случае.

app.js:

fs.readdir('./routes', function(err, files){
    files.forEach(function(fn) {
        if(!/\.js$/.test(fn)) return;
        require('./routes/' + fn)(app);
    });
});

./routes/index.js:

module.exports = function(app) {
        var data_dir = app.get('data-dir');

    app.get('/', function(req, res){
        res.render('index', {title: 'yay title'}
    });
}

Возможно, кто-то найдет этот подход полезным.

Ответ 3

Моя проблема заключалась в том, что я объявлял приложение неправильно. Вместо var app = module.exports = express.createServer(); он должен был быть только app = express.createServer();

И тогда все, что мне нужно было сделать в моем приложении app.js, было require('./routes.js');. Теперь файл маршрутов имеет доступ к переменной приложения, и теперь я могу просто объявлять маршруты обычно в файле маршрутов.

(routes.js)

app.get('/test', function(req, res){
    console.log("Testing getter");
    res.writeHead('200');
    res.end("Hello World");
}); 

Ответ 4

глобальное "приложение" для меня (обычно). Если вы знаете, что приложение не будет требовать() d, и если вы не неуклюжий, гораздо легче работать с

Ответ 5

пример в app.js

var users = require('./lib/users'); //this is your own module
app.use(users);

тогда вы в своей папке lib/users, создайте файлы (index.js, user.ejs и т.д.). используйте index.js для загрузки по умолчанию модуля   //index.js   var express = require ('express');   var app = module.exports = express();

app.set('views',__dirname);
app.set('view engine','ejs');
app.get('/users',function(req,res){
    //do stuffs here
});

Я сделал пример Modular node.jes + Boostrap здесь: Nodemonkey или репетитор здесь здесь