【问题标题】:Calling non existing property in MongooseJS / NodeJS在 MongooseJS / NodeJS 中调用不存在的属性
【发布时间】:2013-02-08 17:46:32
【问题描述】:

如果我在猫鼬中有一个看起来像这样的模式(示例):

Meta = new Schema
  type_id:Number,
  datahash: String,
  data: Schema.Types.Mixed

这一切都很好。我可以查询 Meta.datahash 并取回值等等。但是如果我查询 Meta.OtherProp,那么我会得到一个错误,因为该属性不存在于型号。

在 PHP 中,你有可以处理这个问题的魔法方法(getter/setter)。

有没有办法在 Mongoose(或 NodeJS)中做到这一点。非常欢迎示例:)

BR/太阳

编辑: 假设数据是这样的对象:

{
  56:'somevalue',
  77:'Othervalue'
}

现在 - 有什么方法可以像这样直接查询

Meta.data.56

然后返回“somevalue”?

还有没有办法避免我查询的js错误

Meta.data.90

因为属性不存在?

【问题讨论】:

  • 这个错误是JS错误还是Mongoose错误?
  • data 声明为Schema.Types.Mixed,您应该能够查询其中的任何字段,而无需在架构中声明它。
  • 我需要的是 [] 而不是点符号和猫鼬中的默认值。

标签: node.js mongoose


【解决方案1】:

我没用过猫鼬。但这里有一些模式可用于在同步和异步情况下设置默认值。

var  DATA={ 56:'somevalue',  77:'Othervalue' };

// SYNC: from JS object
function getPropOrDefault(prop){
  var val = DATA[String(prop)];
  var ret = (val !== undefined ? DATA[String(prop)] : 'default');
  return ret;
};


// ASYNC: from mongoose
function getFromMongoose(key,fn){
//or something. idk how u query mongoose
  process.nextTick(function(){
    var val = DATA[String(key)];
    if(val === undefined) { fn(new Error('no_property')) }
    else{ fn(null, val) };
  });
};

function getMongoosePropOrDefault(prop, callback){
  getFromMongoose(prop, function(err, result){
    if(err){ 
      callback(err, 'default');
    } else {
      callback(null, result);
    };
  });
};


(function main(){
  console.log('DATA[77]: '+getPropOrDefault(77) );
  console.log('DATA[99]: '+getPropOrDefault(99) );
  getMongoosePropOrDefault(77, function(err, result){
    console.log('mongoose.data.77: '+result);
  });
  getMongoosePropOrDefault(99, function(err, result){
    console.log('mongoose.data.99: '+result);
  });
})();

【讨论】:

    【解决方案2】:

    感谢您的回复。

    事实证明,如果我只是为 Meta.data 设置一个默认值,那么我可以使用方括号 [] 而不是点符号来查询数据中不存在的属性:

    Meta.data[88]
    

    这解决了我的问题,这实际上与 js 相关,而不是 node 或 mongoose。当然,这在查询子属性时不起作用:

    Meta.data[88].something
    

    除非 88 确实存在。但同样 - 那只是 javascript...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-04
      • 2021-08-01
      • 1970-01-01
      • 2018-03-12
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      相关资源
      最近更新 更多