Как вы модулируете 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 или репетитор здесь здесь