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

Javascript 如何使用/Express模块化Node.JS,javascript,node.js,express,Javascript,Node.js,Express,我正在尝试模块化我的node.js应用程序(使用express framework)。我遇到的麻烦是在设置路线时 我再也无法提取发送给邮局的数据了。(请求主体未定义)。如果所有文件都在同一个文件中,则可以正常工作。我在这里做错了什么?在node.js中模块化代码的最佳方法是什么 我的app.js require('./routes.js').setRoutes(app); 我的路线.js exports.setRoutes = function(app){ app.post('/ask'

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

我再也无法提取发送给邮局的数据了。(请求主体未定义)。如果所有文件都在同一个文件中,则可以正常工作。我在这里做错了什么?在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
      }
    });
});

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

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

(routes.js)

更好的方法:

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

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

module.exports = function(app) {
  app.all('/', index.index);
}
然后,在server.js中(或以启动服务器的方式),您需要这样做:

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

这样,您就不会创建全局变量,这些全局变量会带来一系列问题(可测试性、冲突等)

我的全局“应用程序”(通常)。如果你知道这个应用程序不会是require()d,如果你不笨拙,那么使用它会容易得多,我知道有人已经回答了,但我还是要做以下几点

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'}
    });
}
也许有人会觉得这种方法很有用。

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=需要(“express”); var app=module.exports=express()


我在这里举了一个Modular node.jes+Boostrap的例子:或者在这里做一个导师

这是一个糟糕的做法,因为你将应用程序实例化为一个全局变量。最好将其传递到routes.js文件中(例如,在接受应用程序变量的routes.js中导出init函数)。了解一下为什么快速安装提供的默认设置是这种“错误做法”会很好:(很明显,globals不太好,但这是我们提供的模板。这是更好的方法。多亏了你,我已经在我的项目中开始这样做了!这种方法很好,我在@ctide上找到了一个更完整的例子,你如何从index controller访问应用程序?我不,你不应该这样做。你是什么您试图在需要webserver对象的路由中完成吗?index函数将接收req、res和next参数,这些参数应该是您所需要的。为什么是app.all()而不是app.get()?感谢您的回答!使用全局“app”时应该避免什么样的事情?重新分配它:D如果您的应用围绕“应用程序”作为资源,您可能会使用“var app="很多时候,我绝对不会建议您这样做。如果
fs.readdir
是异步的,请注意
require
是一个同步函数。因此每次运行应用程序时,模块的执行顺序都会有所不同。但是您可以在
forEach
之前对文件数组进行排序,以确定它。您也可以异步y将文件预加载到
require.cache
,以便在应用程序需要大量重新启动时更快地启动。
var users = require('./lib/users'); //this is your own module
app.use(users);
app.set('views',__dirname);
app.set('view engine','ejs');
app.get('/users',function(req,res){
    //do stuffs here
});