Проблема с запросом PUT, не обновляющим запись с использованием MongoDB, Node и Express - PullRequest
0 голосов
/ 14 октября 2019

Используя стек MERN и не может получить запрос PUT, чтобы в этом случае обновить информацию о пациенте.

Маршруты пациента - Patient.js

//@route   POST api/patients
//@desc    Create patient profile
//@access  Private, patient information
router.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');
        }
    }
);

//@route   GET api/patients/:patient_id
//@desc    Get patient by ID
//@access  Private, patient information
router.get('/:patient_id', auth, async (req, res) => {
try {
    const patient = await Patient.findById(req.params.patient_id);

    if(!patient) {
        return res.status(400).json({ msg: "This patient does not exist." });
    }
    res.json(patient)
} 
catch (err) {
    console.error(err.message);
    if(err.kind == 'ObjectId') {
            return res.status(400).json({ msg: 'Patient not found' })
        }
    res.json(500).send({ msg: 'Server Error in get patient by user ID' })
    }
});

//@route   PUT api/patients/:patient_id
//@desc    Update patient information
//@access  Private, patient information
router.put('/:patient_id', async (req,res) => {
    try {
        let patient = await Patient.findById(req.params.patient_id); 

        if(patient) {
            patient = await Patient.findOneAndUpdate(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 
                }
            );
        }
        return res.json(patient);
    } 
    catch (err) {
        console.error(err.message);
        res.status(500).send('Server Error in update patient info')
    }
});

Я ссылалсяучебник для этого проекта, но в учебнике маршрут создания профиля также обновил профиль, потому что он ссылался на идентификатор вошедшего в систему пользователя.

Когда я проверяю это с почтальоном, я отправляю в Patient_id вURL-адрес пациента, который я хочу обновить, и он отправляет обратно информацию о другом пациенте в БД.

Как изменить запрос на ввод данных для обновления информации о пациенте?

Спасибо!

Ответы [ 2 ]

1 голос
/ 14 октября 2019

mongoose findOneAndUpdate возвращает исходный документ, если вы хотите вернуть обновленный документ, вам нужно передать {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");
  }
});

0 голосов
/ 14 октября 2019

Вы никогда не найдете пациента или у вас есть ошибки при обновлении. Попробуйте выполнить функцию .then & .catch для своей функции обновления и посмотрите, какие будут ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...