0

うまく説明できない奇妙な問題があります。以下を考えると:

Generics.prototype.getCollection= function(collection,callback) {
  this.db.collection(collection, function(error, document_collection) {
    if( error ) callback(error);
    else callback(null, document_collection);
  });
};

Generics.prototype.findById = function(collection, id, callback) {
    this.getCollection(collection,function(error, document_collection) {
      if( error ) callback(error)
      else {
        document_collection.findOne({_id: document_collection.db.bson_serializer.ObjectID.createFromHexString(id)}, function(error, result) {
          if( error ) callback(error)
          else callback(null, result)
        });
      }
    });
};

Generics.prototype.findOne = function(collection, _key, _value, callback) {
    this.getCollection(collection,function(error, document_collection) {
      if( error ) callback(error)
      else {
        document_collection.findOne({_key:_value}, function(error, result) {
          if( error ) callback(error)
          else callback(null, result)
        });
      }
    });
};

findById は魔法のように機能します。ただし、findOne は実行時に常に null を返します。node-debugger を起動して取引内容を調べたところ、渡された変数の 1 つが何らかの形で破棄/消去されていることがわかりました。_key は常に消去されているようです。ただし、_value は常に存在します。_key の名前を別のものに変更しようとしましたが、何があっても常に消去されます。何が起こっているのかについてのアイデアをいただければ幸いです。ありがとう!

更新 より柔軟な検索クエリを可能にするために少しリファクタリングし、1 つの変数で動作するようにしました。どうなっているのかまだまだ知りたいです。私がよく理解していないのは、閉鎖ビジネスのように感じます。

Generics.prototype.findOne = function(collection, searchKeys, callback) {
    this.getCollection(collection,function(error, document_collection) {
      if( error ) callback(error)
      else {
        document_collection.findOne(searchKeys, function(error, result) {
          if( error ) callback(error)
          else callback(null, result)
        });
      }
    });
};
4

1 に答える 1

1

findOneメソッドに渡したときと同じように{}構文を使用すると、Javascriptは常にオブジェクトのキーを文字列として扱います。

{_key:_value}

つまり、上記のオブジェクトは基本的に次のように扱われます。

{ '_key': _value }

私はあなたが望むものではないと思います。これを克服するための一般的なアプローチの1つは、オブジェクトを作成し、次のように[]演算子を使用することです。

var temp = {};
temp[_key] = _value; // here, the _temp symbol is interpreted as a js variable
于 2012-04-06T20:12:43.090 に答える