Как вы модульный Node.JS ж / Экспресс - PullRequest
13 голосов
/ 20 февраля 2011

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

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

Мой 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
      }
    });
});

Ответы [ 5 ]

30 голосов
/ 13 июля 2011

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

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

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

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

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

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

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

3 голосов
/ 06 августа 2012

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

app.js:

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

. / Router / index.js:

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

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

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

2 голосов
/ 24 февраля 2011

Моя проблема заключалась в том, что я неправильно объявлял приложение. Вместо 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");
}); 
0 голосов
/ 11 февраля 2014
Пример

в 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
});

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

0 голосов
/ 06 октября 2011

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

намного проще
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...