2013-02-21 4 views
8

Mongoose.jsnode.jsとします。mongoose.js CastError:パス「未定義」の値「[オブジェクトオブジェクト]」の数値へのキャストに失敗しました

var Photo = new Schema({ 
    URL:String 
    ,description:String 
    ,created_by:{type:ObjectId, ref:'User'} 
    ,created_at:{type:Date, default:Date.now()} 
}); 

var User = new Schema({ 
    name:{type:String,index:true} 
    ,email:{type:String,index:true, unique:true} 
}); 

//Task model                                              
var Task = new Schema({ 
    title:String 
    ,created_by:{type:ObjectId, ref: 'User'} 
    ,created:{type:Date, default:Date.now()} 
    ,responses:[{ 
     type:Number 
     ,user:{type:ObjectId, ref: 'User'} 
     ,comment:String 
     ,avatarURL:String 
     ,photo:{type:ObjectId, ref: 'Photo'} 
     ,created:{type:Date, default:Date.now()} 
    }] 
}); 

//Group model                                              
var Group = new Schema({ 
    name:String 
    ,tasks:[Task] 
}); 

と、このコードのエラーアウト(グループは、応答は空の配列は、ユーザーが有効である、というIDXのタスクは大丈夫です、大丈夫です写真が有効である)::

私はこのスキーマを持っている

この問題を解決するか、Cであるかもしれないものかについて

/home/admin/notitws/node_modules/mongoose/lib/utils.js:434 
     throw err; 
      ^
CastError: Cast to number failed for value "[object Object]" at path "undefined" 
    at SchemaNumber.cast (/home/admin/notitws/node_modules/mongoose/lib/schema/number.js:127:9) 
    at Array.MongooseArray._cast (/home/admin/notitws/node_modules/mongoose/lib/types/array.js:78:15) 
    at Object.map (native) 
    at Array.MongooseArray.push (/home/admin/notitws/node_modules/mongoose/lib/types/array.js:187:23) 
    at exports.taskAddPhoto (/home/admin/notitws/routes/group.js:1097:35) 
    at Promise.exports.createPhoto (/home/admin/notitws/routes/photos.js:106:4) 
    at Promise.addBack (/home/admin/notitws/node_modules/mongoose/lib/promise.js:128:8) 
    at Promise.EventEmitter.emit (events.js:96:17) 
    at Promise.emit (/home/admin/notitws/node_modules/mongoose/lib/promise.js:66:38) 
    at Promise.complete (/home/admin/notitws/node_modules/mongoose/lib/promise.js:77:20) 

任意のアイデア:私は次のエラーを取得するその時点で

var typePhoto = 6; 
var resp = { 
     type: typePhoto//photo                                     
     ,user: user._id 
     ,photo: photo._id 
}; 


group.tasks[taskIdx].responses.push(resp); //errors out here 

それを使って?

PS私はtasks.responses.usertasks.responses.phototasks.created_byを入力しています。

+0

これは、型変換に失敗したデータベース内の値です。保存されている値は問題ありませんでした。エラーが保存時に発生し、検索時に発生しないことは奇妙です。 –

答えて

20

"type"キーワードは、フィールドのタイプを判断するためにmongooseによって使用されます。 Mongooseはおそらく、応答は配列の代わりにNumber型であると考えています。

試してみてください。

responses:[{ 
    type: {type: Number} 
    ,user:{type:ObjectId, ref: 'User'} 
    ,comment:String 
    ,avatarURL:String 
    ,photo:{type:ObjectId, ref: 'Photo'} 
    ,created:{type:Date, default:Date.now()} 
}] 

別の方法としては、スキーマにあなたの応答オブジェクトをラップするために、次のようになります。

responses: [Response] 
+0

ああ、もちろん!ありがとうございました! ...今、それは私がそれが人口ではないクラッシュしないようにするが、あなたはクラッシュを解決したので、もう一度ありがとう! –

+0

あなたは 'default:Date.now'だけを()カッコなしで試しましたか? –

2

私はOBJECTIDに私のキャストを固定するもの掲載しています。私の機能文書のupdatedByキーの話です。問題のある領域がキャスティングの問題に対応していることを示すコメントを追加しました。

import mongoose;

var mongoose = require('mongoose'); 

objectIdを定義します。

var ObjectId = mongoose.Schema.Types.ObjectId; 

スキーマにタイプを定義します。

var featureSchema = new Schema({ 
     name: String, 
     isSystem: { type: Number, min: 0, max: 1 }, 
     updatedBy: {type:ObjectId, ref:'users'}, //here I defined the field! 
     updatedAt: { type: Date, default: Date.now } 
}); 

です。その後、postメソッドを使用してドキュメントを挿入します。

app.post('/features', function (req, res){ 
      var feature; 
      console.log("POST: "); 
      console.log(req.body); 
      feature = new Feature({ 
        name: req.body.name, 
        isSystem: req.body.isSystem, 
        updatedBy: req.body.updatedBy, //here I insert the objectId field 
        updatedAt: new Date() 
      }); 
      feature.save(function (err) { 
        if (!err) { 
          return console.log("created"); 
        } else { 
         return console.log(err); 
        } 
      }); 
     return res.json({ features: feature }); 
    }); 

最後にこれがあなたのjson文字列です。あなたは、Google ChromeのJavascriptコンソールまたは同様のものから起動することができます。

jQuery.post("/features", { 
       "name": "Receipt", 
       "isSystem": 0, 
       "updatedBy": "528f3d44afcb60d90a000001" 
    },function (data, textStatus, jqXHR) { 
       console.log("Post resposne:"); console.dir(data);     
       console.log(textStatus);        
       console.dir(jqXHR); 
    }); 
関連する問題