Node.JS MVC - 在哪里放置数据访问代码?

时间:2012-11-22 16:11:52

标签: node.js

我现在已经启动并运行了一些小型Node.js / Express应用程序,但我从未对任何数据库访问解决方案感到满意。

  • 我开始使用脂肪控制器'其中包括数据库访问;
  • 我尝试过胖子模特'使用Mongoose,但这严重污染了具有数据库访问权限的模型;
  • 我尝试了一种DAO模式,我将用Java实现,并将我的模型转换回值对象来移动数据,但这并不是非常惯用的。

您认为Node.js MVC网络应用程序的数据库访问代码在哪里?

回到ActiveRecord,一切都被原谅了。

1 个答案:

答案 0 :(得分:2)

在我看来,这实际上取决于您使用的是哪种数据库。当使用MySQL时,我通常在控制器中使用它们,而在使用MongoDB时,我将它们放入模型中,因为它感觉更自然。老实说,由于NodeJS更像是一个升级的javascript,MVC就是定义。

当通过NPM思考MVC和NodeJS的结构时,可以轻松地考虑将数据库访问转移到新模块中。我对nodeJS中实现数据库访问的方式也不是很满意。

使用Express时虽然我们通常应用RESTful接口并使用路由来填充CRUD操作。我的应用程序从来没有那么大,这样的行为会非常大,但对于大型项目,人们可能想要构建像这样的路径

app.get('/api/item', function(req, res){
 //access to your API and do database business
});

通过将它们拆分为名为datbase.js的数据库访问文件来更合适,更有条理的形式,可以通过

加载到主应用程序中
require('./datbase.js').setupDatabase('localhost', port);

例如,这样的数据库管理器可能看起来像

function setupDatabase(address, port) {
  //connect to your datbase
  //access to your API and do database business
 });
}

module.exports.setupDatabase = setupDatabase;

我个人从未尝试过这种方式,但在我看来,这可以帮助您构建更好地访问数据库的方式。希望这有帮助!

修改 由于要求CRUD的实现,我发布一个与Mongoose。您可以与正在使用的其他每个数据库进行交换

var application_root = __dirname,
 express = require("express"),
 path = require("path"),
 mongoose = require('mongoose');

var app = express();

mongoose.connect('mongodb://localhost/my_database');

var Item = mongoose.model('Item', new mongoose.Schema({
  text: String
}));

app.configure(function(){
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(path.join(application_root, "public")));
});

app.get('/', function(req, res){
  res.send('Hello World');
});

app.get('/item', function(req, res){
  res.render('item', {title: "Your App"});
});

app.get('/api/items', function(req, res){
  return Item.find(function(err, items) {
    return res.send(items);
  });
});

app.get('/api/items/:id', function(req, res){
  return Item.findById(req.params.id, function(err, item) {
    if (!err) {
      return res.send(item);
    }
  });
});

//etc.

所有这些CRUD操作都适用于您在Backbone应用程序中引入并将其与MongoDB连接的模型。除了MongoDB的一般路径,您还可以使用其他包来创建一个mysql查询,使用NPM并安装nodejs-mysql-native,我发现它有时非常有用。