如何使用/ Express模块​​化Node.JS

时间:2011-02-20 07:40:16

标签: javascript node.js express

我正在尝试模块化我的node.js应用程序(使用快速框架)。我遇到的麻烦是在设置我的路线时。

我无法再提取发送到帖子的数据。 (req.body未定义)。如果它们都在同一个文件中,则可以正常工作。我在这里做错了什么,在node.js中模块化代码的最佳方法是什么?

我的app.js

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

我的路线.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 个答案:

答案 0 :(得分:30)

更好的方法:

创建包含以下内容的routes.js文件:

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

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

然后,从您的server.js内部(或者您启动了服务器),您需要它:

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

这样你就不会创建全局变量,带来一大堆问题(可测试性,碰撞等)。

答案 1 :(得分:3)

我意识到有人已经回答了,但无论如何我都是这样做的。

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

也许有人会发现这种方法很有帮助。

答案 2 :(得分:2)

我的问题是我以错误的方式宣布应用程序。它应该只是var app = module.exports = express.createServer();

,而不是app = express.createServer();

然后我在app.js中需要做的就是require('./routes.js');。现在,routes文件可以访问app变量,现在我可以在routes文件中正常声明路由。

(routes.js)

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

答案 3 :(得分:0)

全球“app”对我来说(通常)。如果你知道应用程序不会被要求()d,如果你不笨拙,那么使用它会容易得多

答案 4 :(得分:0)

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或者这里的导师here