Как ссылаться на другую модель, используя object_id в инструкции http при публикации? (монго дб)

#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» для списка допустимых типов схем.