router.post / добавление вложенного массива в базу данных MongoDB с использованием Node JS, express, mongoose - PullRequest
0 голосов
/ 24 февраля 2019

Ниже вы можете найти пример местоположения, которое было создано с использованием моей схемы Place с массивом местоположений и билетов.Внутри массива билетов есть вложенный массив заметок.Я пытаюсь использовать функцию router.post и загрузить заметку в базу данных, используя unshift, но безуспешно.Подскажите пожалуйста, что я делаю не так?Спасибо!

Это ошибка, которую я получаю:

(узел: 36073) UnhandledPromiseRejectionWarning: TypeError: Невозможно прочитать свойство 'tickets' с нулевым значением на Place.findOne.then.place (/Users/fifi/Desktop/FAM./routes/tickets.js:111:13) в processTicksAndRejected (internal / process / next_tick.js: 81: 5) (узел: 36073) UnhandledPromiseRejectionWarning: необработанное отклонение обещания.Эта ошибка возникла либо из-за того, что внутри асинхронной функции возникла ошибка без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch ().(идентификатор отклонения: 1) (узел: 36073) [DEP0018] Предупреждение об устаревании: отклонения необработанного обещания устарели.В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом выхода.

"_id" : ObjectId("5c716edf8f0d6f7b5b4b310f"), 
"location" : [
    {
        "phoneNumber" : "+1 212-226-3126", 
        "website" : "https://www.apple.com", 
        "contactEmail" : "apple1004SoHo@apple.com", 
        "_id" : ObjectId("5c716edf8f0d6f7b5b4b3110"), 
        "street" : "Prince St", 
        "buildingNumber" : 103, 
        "buildingAddition" : "", 
        "postcode" : "10012", 
        "city" : "New York", 
        "country" : "United States", 
        "latitude" : 40.725056, 
        "longitude" : -73.999027
    }
], 
"tickets" : [
    {
        "status" : "Unassigned", 
        "_id" : ObjectId("5c729175bdfe628cb5a205c3"), 
        "ticketUser" : ObjectId("5c6d2e81e6117a2ddb07b070"), 
        "description" : "Test", 
        "priority" : "Medium", 
        "notes" : [

        ], 
        "createdAt" : ISODate("2019-02-24T12:43:33.342+0000"), 
        "updatedAt" : ISODate("2019-02-24T12:43:33.342+0000")
    }
], 
"customerID" : "Apple", 
"placeID" : "1004", 
"name" : "SoHo", 
"__v" : 2

  router.post('/notes/:id', (req, res) => {
  Place.findOne({
    _id: req.params.id
  })
    .then(place => {
      const newNote = {
        noteBody: req.body.noteBody,
        noteUser: req.user.id,
      }
      place.tickets.notes.unshift(newNote);
      place.save()
        .then(place => {
          res.redirect('back')
        });
    });
});

1 Ответ

0 голосов
/ 24 февраля 2019
  • findOne возвращает null или undefined, если элемент, соответствующий вашему запросу , не найден.
  • Если элемент place равен null, товызов place.tickets вызовет ошибку

Добавьте оператор if, чтобы проверить, является ли элемент place null перед применением остальной логики

Code

Place.findOne({
    _id: req.params.id
  })
  .then(place => {
    // Add the IF here
    if (!place) {
      return res.status(404).send('Place not found');
    }

    const newNote = {
      noteBody: req.body.noteBody,
      noteUser: req.user.id,
    }

    place.tickets.notes.unshift(newNote);
    place.save()
      .then(place => {
        res.redirect('back')
      }).catch(err => res.send(err));
  }).catch(err => res.send(err));

Примечания

  • .findOne({_id: req.params.id}) эквивалентно .findById(req.params.id)
  • Не забудьте catch при звонкеthen.В противном случае ваш запрос может прерваться и не вернуть ответ, если сервер обнаружит ошибку
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...