【问题标题】:mongoose error Cast to ObjectId failed for value xxx with postman猫鼬错误 Cast to ObjectId failed for value xxx with postman
【发布时间】:2017-04-04 19:18:26
【问题描述】:

在学习 mongoose 教程时,名为 followers 的模式字段的类型为 ObjectId 数组: followers:[Schema.Types.ObjectId]

我用邮递员提交了一个新文档,POST数据是JSON格式:

{
"title":"test title999",
"text":"test text999b",
"meta":[1, [], 'three', { four: 5 }],
"followers":["582ff61afe100611809e7fa5"]
}

应用程序的快速 POST 路由有一个验证方法,我对所有字段都没有任何问题,除了上面提到的一个,因为我收到了这个错误:

{
     "message": "Post validation failed",
     "name": "ValidationError",
     "errors ":{
       "followers ":
         {"message ":"Cast to ObjectID failed for value\ "[ '\"577f9cecd71d71fa1fb6f43a\ "' ]\" at path \"followers\"",
          "name": "CastError",
          "kind": "ObjectID ",
          "value ":["\"577f9cecd71d71fa1fb6f43a\""],
          "path": "followers",
          "reason": {
              "message ":"Cast to ObjectId failed for value\ "[ '\"577f9cecd71d71fa1fb6f43a\"' ]\" at path\ "followers\"",
              "name": "CastError",
              "kind": "ObjectId",
              "value": ["\"577f9cecd71d71fa1fb6f43a\ ""],
              "path": "followers"
          }
      }
   }
 }

---- 编辑 -----

POST 路由中的 validate 方法:

app.post('/posts', function(req, res, next) {
    var post = new Post(req.body);
    post.validate(function(error){
        console.log("\n\n validate error : " + JSON.stringify(error) + "\n\n");
        if(error) return next(error);
        post.save(function(error, result){
            console.log("\n\n save error : " + JSON.stringify(error) + "\n\n");
        if(error) return next(error);
        res.send(result); 
    });
    });

});

和模型:

var postSchema = new Schema({
    title:{
        type:String,
        required:true,
        trim:true,
        match:/^([\w ,.!?]{1,100})$/
    }, 
    text:{
        type:String,
        required:true,
        max:2000
    },
    followers:[Schema.Types.ObjectId],
    meta:Schema.Types.Mixed,
    viewCounter:Number,
    published:Boolean,
    createdAt:{
        type:Date,
        default:Date.now,
        required:true
    },
    updatedAt:{
        type:Date,
        default:Date.now,
        required:true
    }

});

【问题讨论】:

  • 您能否提供有关您的验证方法的更多详细信息?你的模特?
  • 完成,已更新

标签: mongoose


【解决方案1】:

您需要在post 模型中附加对followers 属性的引用,假设另一个模型称为user,如下所示:

followers: {type: Schema.Types.ObjectId, ref: 'User'}

阅读更多关于在 here 中引用 mongoose 的信息。

【讨论】:

    【解决方案2】:

    在阅读了更多在 mongoose 中使用嵌入式文档的示例(如 this one)之后,我找到了解决方案: followers 字段值作为 String 出现在 body.req 对象中,不能自动转换为 ObjectId。通过解析:

    req.body.followers = JSON.parse(followers);
    

    可以将其保存在其他字段中。 POST 路由变成了这样:

    app.post('/posts', function(req, res, next) {
        req.body.followers = JSON.parse(req.body.followers);
        var post = new Post(req.body);
        post.validate(function(error){
            console.log("\n\n validate error : " + JSON.stringify(error) + "\n\n");
            if(error) return next(error);
            post.save(function(error, result){
                console.log("\n\n save error : " + JSON.stringify(error) + "\n\n");
            if(error) return next(error);
            res.send(result); 
        });
        });
    
    });
    

    因此,POST 请求不能是 100% 动态的,并且必须在保存过程之前完成一些特定的转换。至于 Basim Hennawi 回答不需要将 ref 字段添加到架构的字段中。

    【讨论】:

      猜你喜欢
      • 2013-02-03
      • 2017-08-14
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 2020-11-08
      • 2020-12-10
      相关资源
      最近更新 更多