Ошибка приведения к ObjectID для значения в пути в мангусте - PullRequest
0 голосов
/ 11 февраля 2020

Я создаю приложение для блога с mon goose, node и angular, где задействованы две схемы модели. Один для блогов, а другой для категории. При создании блога категория выбирается из модели категории. Идеальная функциональность должна заключаться в том, что когда пользователь нажимает API создания блога, сначала загружается форма вместе с раскрывающимся списком, в котором существующие списки категорий выбираются с помощью запроса get, а каждый элемент является документом модели категории, имеющей уникальные идентификаторы, созданные с помощью shortId, categoryName, а также mon goose идентификаторы. В раскрывающемся списке выбирается только имя категории. Теперь, когда пользователь заполняет форму и отправляет ее, в функции контроллера узла категория должна сохранить categoryId, а не categoryName, чтобы позже я мог отсортировать несколько блогов с одинаковым categoryId. Но я получаю категорию как неопределенную при создании блога. Но при этом он выдает ошибку на консоли: категория не определена

Модель блога:

const mongoose = require('mongoose')
const Schema = mongoose.Schema;
let blogSchema = new Schema(
    {
        blogId: {type: String,unique: true,index: true},
        title: {type: String,default: ''},
        category : {type: Schema.Types.ObjectId, ref: 'Category'},
        imagePath: {type: String,default: '' }})
mongoose.model('Blog', blogSchema);

Модель категории:

var mongoose = require('mongoose');
const Schema = mongoose.Schema;
var CategorySchema = new Schema(
  {
    categoryId: {
      type: String,unique: true,index: true},
    categoryName: {
      type: String,default: ''
    }})
mongoose.model('Category', CategorySchema);

Блог Создать функцию контроллера:

 let createBlog = (req, res) => {

        CategoryModel.findOne({ 'categoryName': req.body.category }, (err, result) => {
            if (err) { console.log('Error at finding categoryId ::', err); res.send(err) }
            /** If db operation is success findOne will return either document or null, we're only projecting _id */
            if (result) {
                console.log('ZZZZZ'+result.categoryId)
                let blogId = shortid.generate()
                let newBlog = new BlogModel({
                    blogId: blogId,
                    title: req.body.title,
                    category: mongoose.Types.ObjectId(result.categoryId), // As result._id will be string needs to convert it to ObjectId()
                    imagePath: req.file.path
                })
                newBlog.save((err, result) => {
                    if (err) { console.log('Error at saving new blog ::', err); res.send(err) }
                    else { console.log('Successfully saved new blog'); res.send(result) }
                })
            } else {
                console.log('No category found for ::', req.body.category)
                res.send('No category found')
            }
        })
    }

1 Ответ

0 голосов
/ 11 февраля 2020

Ошибка снизу:

Cast to ObjectID failed for value "Movies" at path "category" at

Это потому, что вы передаете строку Movies в поле своей категории модели блога, которая на самом деле ищет ObjectId(), но не строку, поскольку вы Вам нужно указать категорию ObjectId() для поля категории, затем сначала нужно прочитать ее из коллекции категорий и сохранить как категорию при сохранении нового блога.

Контроллер создания блога должен выглядеть следующим образом:

var mongoose = require('mongoose');

let createBlog = (req, res) => {
    CategoryModel.findOne({ 'categoryId': req.body.category }, { _id: 1 }, (err, result) => {
        if (err) { console.log('Error at finding categoryId ::', err); res.send(err) }
        /** If db operation is success findOne will return either document or null, we're only projecting _id */
        if (result) {
            let blogId = shortid.generate()
            let newBlog = new BlogModel({
                blogId: blogId,
                title: req.body.title,
                category: mongoose.Types.ObjectId(result._id), // As result._id will be string needs to convert it to ObjectId()
                imagePath: req.file.path
            })
            newBlog.save((err, result) => {
                if (err) { console.log('Error at saving new blog ::', err); res.send(err) }
                else { console.log('Successfully saved new blog'); res.send(result) }
            })
        } else {
            console.log('No category found for ::', req.body.category)
            res.send('No category found')
        }
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...