4

mongoosemongodb、およびを使用する Node アプリで作業していrestifyます。ルート関数を定義するときに、さまざまなモデルからコードをインポートするのが良い方法かどうかを調べたいと思います。これはかなり簡単な質問です。ガイダンスが必要なだけで、自分でコーディングできます。これを読んでくれてありがとう。

関係を定義する方法は知っていますが、実際の関係をどのように作成すればよいかわかりません。つまり、車が作成されたときに、どのように車を追加するのが最善かということです。

この API を RESTful に保とうとしていることに注意してください。

に格納されている次のスキーマに基づいてリンクする必要がある 2 つのモデルがありますdb/schema.js

//schema.js
  var restify = require('restify');
  var mongoose = require('mongoose');
  var Schema = mongoose.Schema;
  var ObjectId = Schema.ObjectId;

// User Schema

  exports.User = new Schema({
    id: ObjectId,
    name: String,
    cars: [{ type: ObjectId, ref: 'Car' }],
  });

// Car Schema

  exports.Car = new Schema({
    id: ObjectId,
    name: String,
    _user: { type: ObjectId, ref: 'User' },
  });

次に、モデルmodels/...ごとに異なるファイルがある でモデルを構築します。現時点では、それぞれに 1 行のコードしかありませんが、モデル メソッドを記述する必要がある場合に備えて、独立したファイルとして残しました。

models/car.js

  mongoose.model('Car', db_schema.Car);

models/user.js

  mongoose.model('User', db_schema.User);

そして最後に、投稿でルートを設定し、リクエストを入れますroutes/cars.js

これがすべてではありません。私の質問に答えるために必要なだけです。

  module.exports = function(app) {

    function putCar(req, res, next) {
      Car.findById(req.params.id, function (err, car) {
        if (!err) {
          car.name = req.params.name;
          car.save(function (err) {
            if (!err) {
             // PLACE A
             // current_user = get current user from session
             // current_user.cars.push(car);
              res.send(car);
              return next();
            } else {
              return next(new restify.InternalError(err));
            }
          });
        } else {
          return next(new restify.MissingParameterError('ObjectId   required.'));
        }
      });
     }

    function postCar(req, res, next) {
      var car = new Car(req.params);
      car.save(function (err, car) {
        if (!err) {
          // PLACE B
          // current_user = get current user from session
          // current_user.cars.push(car);
          res.send(car);
        } else {
          return next(err);
        }
      });
    }

    app.post('api/car', postCar);
    app.put('/api/car', putCar);
  }

疑似コードのようなコードを A と B に配置するのは適切でしょうか? 私の頭に浮かぶ問題は、routes/cars.js ファイルで User モデルを要求する必要があるということです。これにより、モジュール性が低下します。models/car.js でこれを行う方がよいでしょうか?

4

2 に答える 2

0

私は2つの提案をします:

  1. 残りの関数が比較的大きくなると予想される場合は、残りの関数のそれぞれについて、routes ファイル内の関数コードをコントローラーに抽象化します。

  2. または、各テーブルの周りに独自の DAO (データベース アクセス オブジェクト) ラッパーを作成し、はるかに単純なルート ファイルで呼び出しを行うときに、テーブルではなく JavaScript オブジェクトのように扱うことができます。

于 2013-07-15T06:40:53.003 に答える