8

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

  • 我从包含数据库访问的“胖控制器”开始;
  • 我尝试使用 Mongoose 的“胖模型”,但这严重污染了具有数据库访问权限的模型;
  • 我尝试了一种用 Java 实现的 DAO 模式,并将我的模型转换回值对象来移动数据,但这感觉不是很惯用。

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

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

4

1 回答 1

3

在我看来,这实际上取决于您正在使用哪种数据库架构。使用 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 的一般路径之外,您还可以使用其他包通过使用 NPM 创建 mysql 查询并安装我发现有时非常有用的nodejs-mysql-native 。

于 2012-11-22T16:27:11.217 回答