13

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

我不再能够提取我发送到帖子的数据。(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
      }
    });
});
4

5 回答 5

30

更好的方法:

创建一个 routes.js 文件,其中包含:

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

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

然后,从你的 server.js 中(或者你已经启动了你的服务器),你需要它:

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

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

于 2011-07-13T19:24:04.183 回答
3

我意识到有人已经回答了,但这就是我要做的。

应用程序.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'}
    });
}

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

于 2012-08-05T21:55:37.463 回答
2

我的问题是我以错误的方式声明应用程序。而不是var app = module.exports = express.createServer();,它应该是app = express.createServer();

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

(路由.js)

app.get('/test', function(req, res){
    console.log("Testing getter");
    res.writeHead('200');
    res.end("Hello World");
}); 
于 2011-02-24T06:09:34.163 回答
0

对我来说是全局“应用程序”(通常)。如果您知道该应用程序不会被 require()d,并且如果您不笨拙,那么使用起来会容易得多

于 2011-10-05T20:09:32.810 回答
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 or autor here

于 2014-02-11T18:33:47.890 回答