#javascript #node.js #mongodb #express #rest
Вопрос:
Я использую mongodb для создания API REST для экспресс-приложения с node.js.
Я создал три разные схемы, которые каким-то образом связаны друг с другом, например, книга была написана автором и опубликована издателем. Вот схема для книги.
const mongoose = require('mongoose')
const bookSchema = new mongoose.Schema({
title: {
type: String,
required: true
},
author: {
type: {type: mongoose.Schema.Types.ObjectId, ref: 'Author'},
},
publisher: {
type: {type: mongoose.Schema.Types.ObjectId, ref: 'Publisher'},
},
isbn: {
type: String,
required: true
},
})
module.exports = mongoose.model('Book', bookSchema)
У каждой из этих схем есть идентификатор, но я использую идентификатор по умолчанию, который создается при публикации объекта.
Вот часть файла маршрута.
//Creating one Book
router.post('/', async (req, res) => {
const book = new Book({
title: req.body.title,
author: req.body.author.findById,
publisher: req.body.publisher.findById,
isbn: req.body.isbn
})
try {
const newBook = await book.save()
res.status(201).json(newBook)
} catch {
res.status(400).json({message: err.message})
}
})
Я использую файл .rest для тестирования.
###
POST http://localhost:3000/books
Content-Type: application/json
{
"title" : "test",
"author" : "615c429dfe31a3863b6ebc8e", //object_id of an author in the db
"publisher" : "615f3daf330081bcd5010861", //object_id of a publisher in the db
"isbn" : "1234"
}
Когда я запускаю этот оператор, он просто создает объект, содержащий идентификатор объекта, заголовок и isbn. Автор и издатель остаются в стороне. Я не установил автора и издателя, как требуется в схеме, потому что это выдало бы ошибку (не удалось привести строку к object_id). Я уже пробовал это.
Кто-нибудь может, пожалуйста, сказать мне, как избежать этой ошибки при кастинге? Я уже гуглил и смотрел учебные пособия, но пока ничего не нашел.
Спасибо.
Ответ №1:
Существует разница между Мангустом и родным драйвером MongoDB. Мангуст автоматически преобразует(типизирует) в тип, определенный в схеме.
Ваша схема выглядит нормально, вам просто нужно изменить ее, как
//Creating one Book
router.post('/', async (req, res) => {
const book = new Book({
title: req.body.title,
author: req.body.author,
publisher: req.body.publisher,
isbn: req.body.isbn
})
try {
const newBook = await book.save()
res.status(201).json(newBook)
} catch {
res.status(400).json({message: err.message})
}
})
Комментарии:
1. Спасибо за вашу идею! Я опустил «findById», как вы и предлагали, но, к сожалению, он тоже не работает. При публикации книги теперь у нее есть только ее идентификатор, название и isbn. Автор и издатель по-прежнему игнорируются. Я попытался изменить модель так, чтобы требовались автор и издатель, но это приводит к ошибке в консоли, в которой говорится следующее: Ошибка типа: Недопустимая конфигурация схемы: недопустимый
True
тип в путиauthor.required
. Смотри «bit.ly/mongoose-schematypes» для списка допустимых типов схем.