2012-11-16 119 views
1

我有一个问题MVC方法名赋予一个名字到控制器,载入我的模型:node.js中表达可变

我app.js对于为例我有test.js

var express = require('express'); 
var app = express(); 
app.everyauth = require('everyauth'); 
app.mongoose = require('mongoose'); 

var fs = require('fs'); 

var config = require('./config.js')(app, express); 

//Include models 
var models = {}; 
fs.readdir(__dirname + '/models', function(err, files){ 
    if (err) throw err; 
    files.forEach(function(file){ 
     var name = file.replace('.js', ''); 
     models.name = require('./models/' + name)(app.mongoose).model; 
    }); 
}); 

//Include controllers 
fs.readdir(__dirname + '/controllers', function(err, files){ 
    if (err) throw err; 
    files.forEach(function(file){ 
     var name = file.replace('.js', ''); 
     require('./controllers/' + name)(app, models); 
    }); 
}); 

app.listen(process.env.PORT || 3000); 

在模型

如果我想找到我的分贝东西,我想这样做:

models.test.find({}, function(err, docs){}); 

,但它不工作因为... Ë测试不明,我应该做

models.name.find({}, function(err, docs){}); 

所以我会通过模型的名称替换名称

感谢

回答

3

试试这个;

models[name] = require('./models/' + name)(app.mongoose).model; 

如果你想读取目录同步模式,您可以使用

var models = {}; 
var files = fs.readdirSync(__dirname + '/models'); 
for(var i in files) { 
    var name = files[i].replace('.js', ''); 
    models[name] = require('./models/' + name)(app.mongoose).model; 
} 

// Now, you can use 
models.test 
+0

谢谢,但我有一个问题,如果我CONSOLE.LOG(型号),我有: {测试: {[功能:模式] .... 但是当我尝试的console.log(模型[ '测试'])或执行console.log(models.test) 我已经undefinded – Ajouve

+0

号,您应该使用测试模型作为'models.test'。但是,自从'fs.readdir'异步之后,要小心在哪里调用'models.test'。如果你想使用它作为同步,你可以使用'fs.readdirSync'功能。在你的情况下,你可以在models [name] = require('./ models /'+ name)(app.mongoose).model之后调用'models.test';' –

+0

更新了答案... –