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 以找出交易是什么,我发现其中一个传递的变量正在以某种方式被破坏/擦除。_key 似乎总是被删除。_value 然而总是存在的。我尝试将 _key 重命名为其他名称,无论如何,它总是被删除。任何关于可能发生的事情的想法将不胜感激。谢谢!

更新 我只是重构了一下,以允许更灵活的搜索查询,并使其与一个变量一起工作。我还是想知道发生了什么。我觉得这是一些我不太了解的关闭业务。

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 }

我认为这不是你想要的。克服这个问题的一种常见方法是创建一个对象并使用 [] 运算符,如下所示:

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