У меня установлены следующие модели в проекте 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?