web-dev-qa-db-ja.com

mongoose.js CastError:パス "undefined"の値 "[objectObject]"の数値へのキャストに失敗しました

Mongoose.jsnode.jsとともに使用します。

私はこのスキーマを持っています:

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でのタスクは問題ありません、応答は空の配列です、ユーザーは有効です、写真は有効です):

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


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

その時点で、次のエラーが発生します。

/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)

これを修正する方法や、それを引き起こしている可能性のあるものについてのアイデアはありますか?

PSそれが重要かどうかはわかりませんが、グループを取得するための呼び出しで、tasks.responses.usertasks.responses.phototasks.created_byを入力しています。

9
Matthew Clark

「type」キーワードは、フィールドのタイプを決定するためにマングースによって使用されます。マングースはおそらく、応答は配列ではなく数値型であると考えています。

試してください:

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

もう1つの方法は、応答オブジェクトをスキーマにラップすることです。

responses: [Response]
22

キャストをobjectIdに修正したものを投稿しています。それは私の機能ドキュメントのupdatedByキーの話です。問題のある領域がキャストの問題に対応していることを示すために、いくつかのコメントを追加しました。

マングースをインポートします。

    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文字列です。あなたはグーグル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);
     });
2