2017-03-08 49 views
0

我对使用Express.js相当陌生,但已经编写了几个应用程序。我总是最后向上连接到数据库,在我的app.js文件和附加数据库连接到每一个请求对象,如下所示:Express.js独立模型,视图和控制器

var mongo = require('mongodb'); 
var monk = require('monk'); 
var db = monk('localhost:27017/db'); 

app.use(function(req,res,next) { 
    req.db = db; 
    next(); 
}); 

然后,我的路线文件里面我会做到以下几点:

var express = require('express'); 
var router = express.Router(); 

router.get('/', function(req,res,next) { 

    var db = req.db; 
    var person = db.get('person'); 

    person.find({}, {}, function(err, docs) { 
     if (err) { console.log("error"); } 

     res.status(200); 
     res.send(JSON.stringify(docs)); 
     res.end(); 
    }); 
}); 

但是,我正在经历一个旧的应用程序,我创建了一个我想从我的路线文件中分离模型。例如,继续上面的例子,我希望能够做到这样的事情:

var person = require('./person-model'); 

router.get('/', function(req,res,next) { 
    var list = person.get(); 

    res.status(200); 
    res.send(JSON.stringify(list); 
    res.end(); 
}); 

执行此方法的最佳方法是什么?我应该返回模型的承诺吗?

感谢您的帮助! Dennis

回答

0

您可以拉出文件的所有模型部分,并将它们放到一个新的位置,只要它在项目结构中有意义即可。然后,无论您需要使用什么方法,您都可以穿上与module.exports一起使用的物体。例如,如果您只想要导出db,则可以简单地将module.exports设置为db对象。

var mongo = require('mongodb'); 
var monk = require('monk'); 
var db = monk('localhost:27017/db'); 

module.exports = db; 

然后,在你的路由文件,你可以这样做:

var person = require("./models/person-model.js"); 

router.get('/', function(req,res,next) { 
    var list = person.get(); 

    res.status(200); 
    res.send(JSON.stringify(list); 
    res.end(); 
}); 
+0

确定。但是,在文件person-model.js中我们假设我实现了一个get()函数。我会兑现承诺吗?或结果数组?例如,我会返回person.find({},{});或者将在模型中处理承诺并返回结果person.find({},{})。then(){.. return [数组结果]} –

+0

这真的取决于您如何实现它。如果它是一个异步操作,那么最好还是返回promise,特别是因为从已使用的promise中返回一个数组并不会阻止执行,直到它完成。 –