【问题标题】:Mongoose cast error when populate填充时猫鼬演员错误
【发布时间】:2017-04-18 19:46:06
【问题描述】:

我知道这个问题已经被问了很多,但我真的想不通。

我设置了两个猫鼬模式,一个用户模式和一个问题模式:

用户架构:

const mongoose = require('mongoose');
const passportLocalMongoose = require('passport-local-mongoose');

var UserSchema = mongoose.Schema({
  uid: String,
  name: String,
  username: String,
  insertion: String,
  surname: String,
  email: String,
  password: String,
  birthday: String,
  gender: String,
  avatar: String,
  school: String
});

UserSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model("User", UserSchema);

和问题架构:

const mongoose = require('mongoose');

var vragenSchema = new mongoose.Schema({
question: String,
lesson: String,
answered: Boolean,
author: {
  id: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User"
  },
  username: String
},
date: {
  type: Date,
  default: Date.now
},
description: String,
answersCount: Number,
user_votes: Number,
answers: [{
  type: mongoose.Schema.Types.ObjectId,
  ref: "Answers"
}]
});

module.exports = mongoose.model("Vragen", vragenSchema);

当我尝试使用此代码填充文件时:

app.get("/vragen/:id", isLoggedIn, function(req, res) {
  Vragen.findById(req.params.id).populate("author").exec(function(err,gevondenVraag) {
    if (err) {
      console.log(err);
    } else {
      res.render("vragen/show.ejs", {vragen: gevondenVraag})
    }
   });
});

它给了我一个演员错误:

{ CastError: Cast to ObjectId failed for value "{ id: '5840a19db36cd81788505018', username: 'TygoD' }" at path "_id"
  at MongooseError.CastError (F:\PWS\node_modules\mongoose\lib\error\cast.js:26:11)
  at ObjectId.cast (F:\PWS\node_modules\mongoose\lib\schema\objectid.js:147:13)
  at ObjectId.castForQuery (F:\PWS\node_modules\mongoose\lib\schema\objectid.js:187:15)
  at F:\PWS\node_modules\mongoose\lib\schematype.js:868:18
  at Array.map (native)

  at ObjectId.handleArray (F:\PWS\node_modules\mongoose\lib\schematype.js:867:14)
  at ObjectId.castForQuery (F:\PWS\node_modules\mongoose\lib\schema\objectid.js:185:20)
  at cast (F:\PWS\node_modules\mongoose\lib\cast.js:213:39)
  at Query.cast (F:\PWS\node_modules\mongoose\lib\query.js:2741:10)
  at Query.find (F:\PWS\node_modules\mongoose\lib\query.js:1144:10)
  at F:\PWS\node_modules\mongoose\lib\query.js:2300:21
  at new Promise.ES6 (F:\PWS\node_modules\mongoose\lib\promise.js:45:3)
  at Query.exec (F:\PWS\node_modules\mongoose\lib\query.js:2294:17)
  at populate (F:\PWS\node_modules\mongoose\lib\model.js:2709:11)
  at _populate (F:\PWS\node_modules\mongoose\lib\model.js:2615:5)
  at Function.Model.populate (F:\PWS\node_modules\mongoose\lib\model.js:2575:5)
message: 'Cast to ObjectId failed for value "{ id: \'5840a19db36cd81788505018\', username: \'TygoD\' }" at path "_id"',
name: 'CastError',
kind: 'ObjectId',
value: { id: '5840a19db36cd81788505018', username: 'TygoD' },
path: '_id',
reason: undefined }

我尝试了几种解决方案,但都没有帮助。这是一个错误还是我做错了什么?

还有 我是 node.js 和 mongodb 的新手,所以如果我可以做任何改进,请告诉我。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您的populate 中应该是author.id,而不是author,您可以尝试如下。

    app.get("/vragen/:id", isLoggedIn, function(req, res) {
      Vragen.findById(req.params.id).populate("author.id").exec(function(err,gevondenVraag) {
        if (err) {
          console.log(err);
        } else {
          res.render("vragen/show.ejs", {vragen: gevondenVraag})
        }
       });
    });
    

    【讨论】:

      【解决方案2】:

      您的 id 类不是 ObjectId! mongo 像这样存储一个普通的 DBRef:

      id: DBRef("User", ObjectId("5840a19db36cd81788505018"))
      

      因此,要么您需要从 ObjectId 更改您的 id 类型,要么您需要修复服务器上的插入和数据!

      【讨论】:

        猜你喜欢
        • 2017-04-04
        • 2018-11-05
        • 1970-01-01
        • 2018-10-27
        • 2018-06-01
        • 2015-07-13
        • 2016-10-10
        • 2019-09-16
        相关资源
        最近更新 更多