Node + Mongoose: создание объектов внешнего ключа на POST - PullRequest
0 голосов
/ 09 июня 2019

У меня установлены следующие модели в проекте node.js с использованием mongoose:

const TalkSchema = Schema({

    _id: Schema.Types.ObjectId,
    name: String,
    location: { type: Schema.Types.ObjectId, ref: 'Location'},
    date: Date,
    person: { type: Schema.Types.ObjectId, ref: 'Person'},
    slides: { type: Schema.Types.ObjectId, ref: 'Link'},
})

const LocationSchema = mongoose.Schema({

    _id: Schema.Types.ObjectId,
    name: String,
    address: String,
})

const LinkSchema = Schema({

    _id: Schema.Types.ObjectId,
    url: String,
    name: String,
})

Я пытаюсь сохранить запись Talk в базе данных, отправив запрос POST со следующимТело:

    {
        "name": "Some name",
        "location": { "name": "a location name", "address": "123 Fake St, Surry Hills NSW 2010" },
        "date": "2019-05-29 18:00:00.000Z",
        "slides": {
            "url": "https://github.com/mygithub/link",
            "name": "Google Slides for the talk"
        },
    }

person указывать не нужно, поскольку оно принадлежит ранее созданной записи и содержится в URL.Однако записи location и slides еще не существуют и должны создаваться вместе с записью Talk.

Сначала я подумал, что смогу просто создать вложенный объект JSON (как показано в паре ключ-значение location ниже).Это сохранило ObjectId в качестве значения для ключа местоположения, однако оно не создало связанную с ним запись.

Тогда я подумал, что смогу обернуть этот объект JSON в конструктор модели.(как показывает пара значений ключа slides).Однако это привело к аналогичному поведению.

router.post('/person/:personId/talk', (req, resp) => {

  const person = req.params.personId

  const talk = new TalkModel({
    _id: new mongoose.Types.ObjectId(),
    name: req.body.name,
    location: {
        _id: new mongoose.Types.ObjectId(), 
        name: req.body.location.name, 
        address: req.body.location.address,
    },
    date: req.body.date,
    person: person,
    slides: new LinkModel({
      _id: new mongoose.Types.ObjectId(),
      url: req.body.slides.url,
      name: req.body.slides.name,
    }),
  })

  talk.save().then(result => {
    resp.status(201).json(result)
  }).catch(err => {
    console.log(err)
    resp.status(500).send(err)
  })
})

После поиска в Google я нашел пример, который использовал асинхронную функцию для создания внешних ключей, например:

async function create(name, address){
  const id = new mongoose.Types.ObjectId()
  new LocationModel({
    _id: id,
    name: name,
    address: address,
  })

  const result = await location.save()
  console.log("Created Location: " + result)
}

ОднакоНапример, было непонятно, как поместить этот код, как его вызвать или как получить вновь созданный ObjectId, чтобы иметь возможность связать его с текущей записью.Я попытался написать эту функцию под моей моделью и вернуть ObjectId, но он возвращает Promise (я предполагаю, потому что это асинхронная функция).

Так что мой вопрос, как мне создать внешний ключобъекты для slides и location в том же запросе POST, который создает запись Talk?

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