为了账号安全,请及时绑定邮箱和手机立即绑定

PUT 请求无法使用 MongoDB、Node 和 Express 更新条目的问题

PUT 请求无法使用 MongoDB、Node 和 Express 更新条目的问题

侃侃无极 2021-11-18 21:07:18
在这种情况下,使用 MERN 堆栈并无法获取 PUT 请求以更新患者信息。患者路线-patient.js//@route   POST api/patients//@desc    Create patient profile//@access  Private, patient informationrouter.post('/', [ auth,    check('firstName', 'First Name is required')        .not()        .isEmpty(),    check('lastName', 'Last name is required')        .not()        .isEmpty(),    check('medicalConditions', 'Medical Conditions are required')        .not()        .isEmpty()    ],     async (req, res) => {        const errors = validationResult(req);        if(!errors.isEmpty()) {            return res.status(400).json({ errors: errors.array() });        }        const {            firstName,            lastName,            dateOfBirth,            phoneNumber,            email,            medicalConditions        } = req.body        //Build patient object        const patientFields = {}        if(firstName) patientFields.firstName = firstName;        if(lastName) patientFields.lastName = lastName;        if(dateOfBirth) patientFields.dateOfBirth = dateOfBirth;        if(phoneNumber) patientFields.phoneNumber = phoneNumber;        if(email) patientFields.email = email;        if(medicalConditions) {            patientFields.medicalConditions = medicalConditions.split(',').map(medicalCondition => medicalCondition.trim());        }        try {            patient = new Patient(patientFields);            await patient.save();            res.json(patient)        }         catch (err) {            console.error(err.message);            res.status(500).send('Server Error in Create/Update Patient');        }    });我一直在参考这个项目的教程,但在教程中,创建配置文件路由也更新了配置文件,因为它引用了登录用户的 ID。当我用 Postman 测试这个时,我在我想要更新的患者的 url 中发送 Patient_id,它正在发送回数据库中不同患者的信息。如何修改 put 请求以更新患者信息?
查看完整描述

2 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

mongoosefindOneAndUpdate 返回原始文档,如果要返回更新的文档,则需要在选项中传递 { new: true} 。


https://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate


您的查询参数也必须是这样的: {_id:req.params.patient_id}


所以你的放置路线必须是:


router.put("/:patient_id", async (req, res) => {

  try {

    let patient = await Patient.findById(req.params.patient_id);


    if (patient) {

      patient = await Patient.findOneAndUpdate(

        { _id: req.params.patient_id },

        {

          firstName: req.body.firstName,

          lastName: req.body.lastName,

          dateOfBirth: req.body.dateOfBirth,

          phoneNumber: req.body.phoneNumber,

          email: req.body.email,

          medicalConditions: req.body.medicalConditions

        },

        { new: true }

      );

    }

    return res.json(patient);

  } catch (err) {

    console.error(err.message);

    res.status(500).send("Server Error in update patient info");

  }

});


另一种解决方案是使用findByIdAndUpdate更短的。如果没有找到文档,返回 400-Bad 请求(或 404 未找到)也是一个好习惯。(正如您在获取路线中所做的那样)


router.put("/:patient_id", async (req, res) => {

  try {

    let patient = await Patient.findByIdAndUpdate(

      req.params.patient_id,

      {

        firstName: req.body.firstName,

        lastName: req.body.lastName,

        dateOfBirth: req.body.dateOfBirth,

        phoneNumber: req.body.phoneNumber,

        email: req.body.email,

        medicalConditions: req.body.medicalConditions

      },

      { new: true }

    );


    if (!patient) {

      return res.status(400).json({ msg: "This patient does not exist." });

    }


    return res.json(patient);

  } catch (err) {

    console.error(err.message);

    res.status(500).send("Server Error in update patient info");

  }

});


查看完整回答
反对 回复 2021-11-18
?
holdtom

TA贡献1805条经验 获得超10个赞

您要么永远找不到患者,要么更新时出错。尝试对您的更新函数执行 .then 和 .catch 并查看抛出的任何错误。


查看完整回答
反对 回复 2021-11-18
  • 2 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信