Обработка ошибки дублирующегося значения в приложении CRUD (реагировать-редукс + экспресс-мангуст) - PullRequest
0 голосов
/ 30 апреля 2018

Наличие mongoose схемы, где carNumber должно быть уникальным:

var Schema = mongoose.Schema({
  createdAt: {
    type: Date,
    default: Date.now
  },
  carNumber: {
    type: String, index: {unique: true, dropDups: true},
  },
  carOwner: String
});

При express данные функции контроллера сохраняются в дБ:

export const addCar = (req, res) => {
  const newCar = new Car(req.body);
   newCar.save((err, car) => {
    if (err) {
      return res.json({ 'success': false, 'message': 'Some Error' });
    }
     return res.json({ 'success': true, 'message': 'Car '+ car.carNumber +' added successfully', car });   
  }) 
}

, но возвращает Unhandled Rejection (TypeError): Cannot read property 'carNumber' of undefined при попытке добавить повторяющееся значение. Во избежание ошибок функция обновляется для проверки undefined значения:

export const addCar = (req, res) => {
  const newCar = new Car(req.body);
   newCar.save((err, car) => {
     if (car.carNumber === undefined) {
           return res.json({ 'success': false, '': 'Some Error' });
      }
    else {
        return res.json({ 'success': true, 'message': 'Car '+ car.carNumber +' added successfully', car });   
       }  
  }) 
}

Но получая Unhandled Rejection (SyntaxError): Unexpected token P in JSON at position 0 при response.json().then(error => { ... } во входном редукционном действии:

export const addNewCar = (car) => {
  console.log(car)
  return (dispatch) => {
    dispatch(addNewCarRequest(car));
    return fetch(apiUrl, {
      method: 'post',
      body: car,
    }).then(response => {
      if (response.ok) {
        response.json().then(data => {
          console.log(data.car);
          dispatch(addNewCarRequestSuccess(data.car, data.message))
        })
      }
      else {
        response.json().then(error => {
          dispatch(addNewCarRequestFailed(error))
        })
      }
    })
  }
}

Чувствуя себя полностью потерянным ... Может кто-то попал в ту же проблему?

1 Ответ

0 голосов
/ 30 апреля 2018

Как уже упоминалось в комментариях, я думаю, у вас есть .then() на вашем json() вместо вашего fetch(). Вам нужно что-то из формы:

export const addNewCar = car => {
  console.log(car);
  return dispatch => {
    dispatch(addNewCarRequest(car));
    return fetch(apiUrl, {
      method: "post",
      body: car
    })
      .then(response => {
        if (response.ok) {
          return response.json();
        } else {
          throw Error('blah')
        }
      })
      .then(data => {
        console.log(data.car);
        dispatch(addNewCarRequestSuccess(data.car, data.message));
      })
      .catch(error => {
        dispatch(addNewCarRequestFailed(error));        
      });
  };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...