DRYな備忘録

Don't Repeat Yourself.

message: 'Cast to string failed for value ","【mongoDB】【mongoose】【JavaScript】【delete】

【問題】

配列の一要素を削除して、mongoDBに突っ込みたいのだが、イカのエラーが出るでゲソ。

ERROR: { message: 'Cast to string failed for value "hoge,,piyo"',
  name: 'CastError',
  type: 'string',
  value: [ hoge, undefined, piyo ] }
DATA: undefined

ちなみにソース

var arr = ['hoge', 'fuga', 'piyo'];
for(var i=0; i<arr.length; i++ ){
  if(arr[i] == 'fuga'){
    delete arr[i];
  }
}
// var someModel = db.model('SomeModelName', someModelSchema);
someModel.props = arr;
someModel.save(function(err, data){
  console.log('ERROR:', err);
  console.log('DATA:', data);
});

【調査】

mongooseで、当該データフィールドの型と制約を以下のように設定しているので、そこに引っかかってると思われ。

var someModelSchema = {
  props : [String],
};

で、突っ込もうとしている値は何かっていうと

f:id:otiai10:20130317095644p:plain

undefinedをStringにキャストできないんだってそりゃそうだ。

delete句で配列要素がさっぱり削除されてlengthも一個減るのかと思ったんだが、そうではなく、undefinedがぶち込まれんすね、と。

f:id:otiai10:20130317100209p:plain

【解決】

スプライス使うか

f:id:otiai10:20130317095841p:plain

こんなかんじで。

var arr = ['hoge', 'fuga', 'piyo'];
for(var i=0; i<arr.length; i++ ){
  if(arr[i] == 'fuga'){
    arr.splice(i,1);
  }
}

【雑感】

JavaScriptはちょうど独学でプログラミングはじめたときから使ってるから、逆にちゃんとドキュメント読んだ事ない。読まずにどうにかしてきちゃったから。今からでも遅くないのでちゃんと読もうと思った。

DRY