如何模块化Node.JS W / Express
我试图模块化我的node.js应用程序(使用快速框架)。 我遇到的麻烦是设置我的路线。
我不再能够提取我发送给该post的数据。 (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 } }); });
更好的方法:
创build一个routes.js文件,其中包含:
var index = require('./controllers/index'); module.exports = function(app) { app.all('/', index.index); }
然后,从你的server.js(或者你已经开始你的服务器),你会需要它:
require('./routes')(app);
这样你就不会创build全局variables,带来一系列的问题(可testing性,碰撞等)
我意识到有人已经回答,但是这里是我所做的。
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'} }); }
也许有人会发现这种方法有帮助。
我的问题是,我是以错误的方式宣布的应用程序。 而不是var app = module.exports = express.createServer();
,它应该只是app = express.createServer();
然后,我需要在我的app.js做require('./routes.js');
。 现在path文件可以访问应用程序variables,现在我可以在路由文件中正常声明路由。
(routes.js)
app.get('/test', function(req, res){ console.log("Testing getter"); res.writeHead('200'); res.end("Hello World"); });
全球“应用程序”为我(通常)。 如果你知道该应用程序不会是require()d,并且如果你不笨拙,那么使用起来要容易得多
例如在app.js中
var users = require('./lib/users'); //this is your own module app.use(users);
然后,你在你的lib / users文件夹中创build文件(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或者这里的导师