そこから新しいオブジェクトを構築するときに、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')