0

そこから新しいオブジェクトを構築するときに、IDが渡されたかどうかを確認するcoffeescriptクラスを作成しようとしています。その場合は、一致するドキュメントを見つけて、そこからオブジェクトを作成してみてください。ID が渡されない場合は、新しい ID を生成して新しいドキュメントを作成します。私はmongojs自分のmongodbに接続するために使用しています。ただし、TestObject クラスから新しいオブジェクトを作成すると、コレクション名は文字列である必要があるというエラーがスローされます。@collection をそのクラスの文字列として設定するので、@collection プロパティとその未定義を console.log に記録します。ここで何が起こっているのか、どうすればこれを機能させることができますか?

class MongoObject
    @collection
    constructor: (id) ->
        @_id = if typeof id is 'undefined' then require('node-uuid').v4() else id
        @db = require('mongojs') config.mongo_server, [@collection]

        @db[@collection].findOne
            _id: @_id,
            (error, story) ->
                # Matching document found. Import data from document
                if not error and story
                    for field, value of story
                        @[field] = value if field is not '_id'

                # Matching document not found. Creating new one
                if not error and not story
                    @db[@collection].save
                        id: @id

                # Error occured
                if error and not story
                    console.error error

                return

class TestObject extends MongoObject
    @collection = 'TestObjects'
    constructor: (id) ->
        super('TestObject')

編集

私のコードを読み直すと、MongoObject でコンストラクターと @collection が定義されていないという問題があることは明らかです。これを行うためのより良いアプローチはありますか? メソッドを作成しsetupDB、スーパー コールの後に MongoObject を拡張する各クラスのコンストラクタでそれを呼び出すことはできましたが、期待していたものではありませんでした。

編集 2

コードを修正しました。constructorただし、未定義のエラーが発生しています。コンパイルされた JavaScript を見るとconstructor;、MongoObject コードの先頭を指しています。var constructor;奇妙なことに、通常は発生す​​るはずのcoffeescript が配置されませんでした。参考までに、翻訳されたJavaScriptを投稿しました

コーヒースクリプト

class MongoObject
    collection: undefined
    constructor: (id) ->
        @_id = if typeof id is 'undefined' then require('node-uuid').v4() else id
        @db = require('mongojs') config.mongo_server, [@collection]

        @db[@collection].findOne
            _id: @_id,
            (error, story) ->
                # Matching document found. Import data from document
                if not error and story
                    for field, value of story
                        @[field] = value if field is not '_id'

                # Matching document not found. Creating new one
                if not error and not story
                    @db[@collection].save
                        id: @id

                # Error occured
                if error and not story
                    console.error error

                return

class TestObject extends MongoObject
    collection = 'TestObjects'
    constructor: (id) ->
        super('TestObject')

Javascript

MongoObject = (function() {
  MongoObject.prototype.collection = void 0;

  function MongoObject(id) {
    this._id = typeof id === 'undefined' ? require('node-uuid').v4() : id;
    this.db = require('mongojs')(config.mongo_server, [this.collection]);
    this.db[this.collection].findOne({
      _id: this._id
    }, function(error, story) {
      var field, value;
      if (!error && story) {
        for (field in story) {
          value = story[field];
          if (field === !'_id') {
            this[field] = value;
          }
        }
      }
      if (!error && !story) {
        this.db[this.collection].save({
          id: this.id
        });
      }
      if (error && !story) {
        console.error(error);
      }
    });
  }

  return MongoObject;

})();

TestObject = (function(_super) {
  var collection;

  __extends(TestObject, _super);

  collection = 'TestObjects';

  function TestObject(id) {
    TestObject.__super__.constructor.call(this, 'TestObject');
  }

  return TestObject;

})(MongoObject);

編集 3

コメントごとにコードを更新しました。その発言@constructor.collectionは未定義です

@db[@constructor.collection].save
    id: @id

セーブのコールバック関数にあるためだと思います。一歩前進、二歩後退。

改訂されたコード

class MongoObject
    @collection
    constructor: (id) ->
        @_id = if typeof id is 'undefined' then require('node-uuid').v4() else id
        @db = require('mongojs') config.mongo_server, [@constructor.collection]

        @db[@constructor.collection].findOne
            _id: @_id,
            (error, story) ->
                # Matching document found. Import data from document
                if not error and story
                    for field, value of story
                        @[field] = value if field is not '_id'

                # Matching document not found. Creating new one
                if not error and not story
                    @db[@constructor.collection].save
                        id: @id

                # Error occured
                if error and not story
                    console.error error

                return

class TestObject extends MongoObject
    @collection: 'TestObjects'
    constructor: (id) ->
        super('TestObject')
4

3 に答える 3

1

@クラスレベルでの意味について混乱していると思います。単純化された例が役立つはずです。この CoffeeScript:

class B
    @p: 'b'

次の JavaScript と同じです。

var B = (function() {
  function B() {}
  B.p = 'b';
  return B;
})();

クラス/関数pに直接アタッチされたクラス プロパティであることがわかります。Cただし、 などのメソッド内にいる場合はインスタンスconstructorを参照する@ため、あなたの場合は、クラス プロパティとして定義しているためです。@collectionundefinedcollection

collectionおそらくインスタンスプロパティになりたいでしょう:

class MongoObject
    collection: undefined
    constructor: (id) ->
        # @collection is what you expect it to be in here

class TextObject extends MongoObject
    collection: 'TextObject'

デモ: http://jsfiddle.net/ambiguous/TzK5E/

collectionまたは、クラス プロパティとして保持し、次の方法で参照でき@constructorます。

class MongoObject
    @collection: undefined
    constructor: (id) ->
        # @constructor.collection is what you expect it to be in here

class TextObject extends MongoObject
    @collection: 'TextObject'

デモ: http://jsfiddle.net/ambiguous/wLjz3/

于 2013-08-26T02:36:45.313 に答える
0

これは私が最終的に得た解決策です

class MongoObject
    @collection
    constructor: (id) ->
        @_id = if typeof id is 'undefined' then require('node-uuid').v4() else id
        @db = require('mongojs') config.mongo_server, [@constructor.collection]

        @db[@constructor.collection].findOne
            _id: @_id,
            (error, doc) =>
                # Matching document found. Import data from document
                if not error and doc
                    console.log 'Document found. Updating.'
                    for field, value of doc
                        @[field] = value if field is not '_id'

                # Matching document not found. Creating new one
                if not error and not doc
                    console.log 'No document found. Creating.'
                    @db[@constructor.collection].save
                        _id: @_id

                # Error occured
                if error and not doc
                    console.error error

                return

class TestObject extends MongoObject
    @collection: 'TestObjects'
于 2013-08-26T04:20:36.007 に答える
0

collection名前を参照するには、少し異なる構文を使用することをお勧めします。

class MongoObject
    @collection 
    constructor: (id) ->
       alert @constructor.collection


class TestObject extends MongoObject
    @collection = 'TestObjects'
    constructor: (id) ->
        super('TestObject')

t = new TestObject

アラート"TestObjects"

の使い方がポイントです@constructor.collection

于 2013-08-26T02:41:24.720 に答える