findByIdAndUpdate一直被.catch捕获

时间:2018-06-25 19:40:14

标签: javascript mongodb mongoose postman mongoose-schema

因此,当我执行findByIdAndUpdate时,它没有按预期执行诺言,而是陷入困境。我使用res.json(req.user.id)res.json(profileFields)向邮递员发送了回复。这是我使用时得到的回应 profileFields

{
    "user": "5b3134a0e2543b06d130a5d7",
    "handle": "wadeaston1",
    "status": "Developer",
    "skills": [
        "HTML",
        " CSS",
        " Javascipt"
    ],
    "social": {}
}

我不知所措,因为我所有的字段都按预期方式将值传递到user和$ set中。我不明白为什么它会吸引我

 Profile.findByIdAndUpdate(
      { user: req.user.id },
      { $set: profileFields },
      { new: true }
    )
      .then(profile => res.json(profile))
      .catch(err => {
        res.json("Timeout");
        console.log("HI");
      });

这是我的个人资料架构

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

//Create Scheme
const ProfileSchema = new Schema({
  user: {
    //this will associate user by their ID
    type: Schema.Types.ObjectId,
    ref: "users"
  },
  handle: {
    type: String,
    required: true,
    max: 40
  },
  company: {
    type: String
  },
  website: {
    type: String
  },
  location: {
    type: String
  },
  status: {
    type: String,
    required: true
  },
  skills: {
    //Array of strings
    type: [String],
    required: true
  },
  bio: {
    type: String
  },
  githubusername: {
    type: String
  },
  experience: [
    {
      title: {
        type: String,
        required: true
      },
      company: {
        type: String,
        required: true
      },
      location: {
        type: String
      },
      from: {
        type: Date,
        required: true
      },
      to: {
        type: Date,
        required: true
      },
      current: {
        type: Boolean,
        default: false
      },
      description: {
        type: String
      }
    }
  ],
  education: [
    {
      school: {
        type: String,
        required: true
      },
      degree: {
        type: String,
        required: true
      },
      fieldofstudy: {
        type: String,
        required: true
      },
      from: {
        type: Date,
        required: true
      },
      to: {
        type: Date,
        required: true
      },
      current: {
        type: Boolean,
        default: false
      },
      description: {
        type: String
      }
    }
  ],
  social: {
    youtube: {
      type: String
    },
    twitter: {
      type: String
    },
    facebook: {
      type: String
    },
    linkedin: {
      type: String
    },
    instagram: {
      type: String
    }
  },
  date: {
    type: Date,
    default: Date.now
  }
});

module.exports = Profile = mongoose.model("profile", ProfileSchema);

2 个答案:

答案 0 :(得分:1)

根据您给出的错误,您似乎需要将req.user.idstring转到ObjectId

Profile.findByIdAndUpdate(
  { user: new mongoose.Types.ObjectId(req.user.id) },
  { $set: profileFields },
  { new: true }
).then( /* rest of code */

这假设您进行了const mongoose = require('mongoose')或类似的操作。

答案 1 :(得分:1)

findByIdAndUpdate用于通过_id值查找要更新的文档,但是您需要通过其user字段来查找文档,因此您应该使用findOneAndUpdate代替:

Profile.findOneAndUpdate(
      { user: req.user.id },
      { $set: profileFields },
      { new: true }
    )
    .then(...

无需手动将req.user.id强制转换为ObjectId,因为Mongoose会根据您在架构中定义user的方式为您完成此操作。