8

現在、いくつかの小さな Node.js / Express アプリケーションを稼働させていますが、データベース アクセスのソリューションに満足したことはありません。

  • データベース アクセスを含む「ファット コントローラー」から始めました。
  • 私は Mongoose を使用して「ファット モデル」を試しましたが、これはモデルをデータベース アクセスのものでひどく汚染します。
  • Java で実装する一種の DAO パターンを試し、モデルを値オブジェクトに戻してデータを移動させましたが、あまり慣用的ではありません。

Node.js MVC Web アプリのデータベース アクセス コードはどこにあると思いますか?

ActiveRecord に戻ってきてください。すべてが許されます。

4

1 に答える 1

3

私の意見では、作業しているデータベース アーチの種類に大きく依存します。MySQL を使用する場合は、通常コントローラーで使用しますが、MongoDB を使用する場合は、より自然に感じるようにモデルに入れます。正直に言うと、NodeJS はよりアップグレードされた JavaScript であるため、MVC は定義がすべてです。

MVC と NPM を介した 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 で投稿しています。作業している他のすべてのDBと交換できます

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 に答える