не может обработать ошибку model.save и вернуться к FE - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь сохранить элемент в БД с помощью Mon goose и вернуть сохраненный элемент или ошибку клиенту. Когда я звоню почтальону с дублирующимся документом, я ожидаю, что получу ошибку дублирования, доберусь до оператора «catch» и получу код состояния 500 и сообщение. Тем не менее, я всегда получаю «then» с результатом undefined и кодом состояния 200. Я также пытался изменить «throw» на «return», но безуспешно. Где я не прав?

Маршрут:

router.post("/", (req, res) => {
  const schema = Joi.object({
    // id: Joi.number().required(),
    name: Joi.string().min(3).required(),
    description: Joi.string().optional(),
    categoryID: Joi.number().required(),
    // ingredients: Joi.array().optional(),
    price: Joi.number().required(),
    vegan: Joi.boolean().required(),
    special: Joi.boolean().required(),
    img: Joi.string(),
  });
  let result = schema.validate(req.body);

  if (result.error) {
    res.status(400).send(result.error);
    return;
  }

  let menu = new Menu();
  const {
    // id,
    name,
    description,
    categoryID,
    ingredients,
    price,
    vegan,
    special,
    // img,
  } = req.body;

  // menu.id = id;
  menu.name = name;
  menu.categoryID = categoryID;
  menu.description = description;
  menu.ingredients = ingredients;
  menu.price = price;
  menu.vegan = vegan;
  menu.special = special;
  // menu.img = img;

  MenuService.saveMenuItem(menu)
    .then((result) => {
      return res.json(result);
    })
    .catch((err) => {
      return res.status(500).send(err);
    });
});

Сервис:

async function saveMenuItem(menuItem) {
  await menuItem.save((err, item) => {
    if (err) throw new Error(err.message);
    return item;
  });
}

module.exports.saveMenuItem = saveMenuItem;

Это маршрут.

Это услуга.

1 Ответ

0 голосов
/ 13 апреля 2020

Вы можете попробовать это:

async function saveMenuItem(menuItem) {
return new Promise((resolve, reject)=>{
      menuItem.save((err, item) => {
         if (err) reject(err.message);
         resolve(item);
})
}
...