Как правильно использовать метод заполнения цепочки в приложении узла?

#javascript #node.js #mongodb #express #mongoose

Вопрос:

Я создаю приложение для блога, используя node.js и реагировать. Я использую MongoDB и хотел бы использовать метод Мангуста .populate для извлечения данных из коллекций. На данный момент у меня есть три коллекции: Post , User и Category коллекции. Я смог использовать этот .populate() метод, чтобы перейти username от User Schema модели и указать ее на Post Schema модель. Таким образом, пользователи могут правильно связать публикацию и свое имя пользователя с ними. Теперь я хочу, чтобы пользователи создавали категории для создаваемых ими сообщений, и я хочу, чтобы эта категория была связана с конкретным сообщением, в котором пользователь разместил сообщение. Я сослался на Category Schema модель в Post модель и используемый populate() метод. После того, как пользователь создаст сообщение, категория не отображается в сообщении. Создание категории работает хорошо. Но категория не заполняется. Кажется, я сделал это неправильно. Вот мой код:

Модель Пост-Схемы

      const mongoose = require("mongoose"); //import mongoose
     const Schema = mongoose.Schema;

     const PostSchema = new mongoose.Schema(
    {
       
        title:{
            type: String,
            required: true,
            unique: true
        },
        description:{
            type: String,
            required: true, 
        },
        postPhoto:{
            type: String,
            required:false,
        },
       username:{
            type: Schema.Types.ObjectId, 
            ref: 'User'
        },
        categories:{
           type: Schema.Types.ObjectId, //referenced Category Schema Model
            ref: 'Category"'
            
        },
       
    }, {timestamps: true}
    );
    //exporting this schema
    module.exports = mongoose.model("Post", PostSchema); //the module name is "Post"
 

Модель Схемы категорий

     const mongoose = require("mongoose"); //import mongoose to be used
    const Schema = mongoose.Schema;

     const CategorySchema = new mongoose.Schema(
    {
       catname:{
           type: String, 
            required: false,
       }
       
      }, {timestamps: true}
      );
     //exporting this schema
     module.exports = mongoose.model("Category", CategorySchema); //the module name is "Post"
 

Почтовый маршрут

      router.get("/:id", async(req, res)=>{
     try{
        const post = await Post.findById(req.params.id).populate('username').populate(' categories')
         
       
        
        //const post = await Post.findById(req.params.id );
        
     
        res.status(200).json(post)

      }catch(err){
        res.status(500).json(err)
      }
      })
 

Категория маршрут

     //creating catergory logic

    router.post("/", async (req, res) =>{
    const newCat = new Category(req.body);//we create a new category for the database
        
    try{
        const savedCategory = await newCat.save();//we need to try and catch the new category and  save it
        res.status(200).json(savedCategory)
    }catch(err){
        res.status(500).json(err)
    }
    })
 

Ответ №1:

В вашем запросе есть опечатка. У вас есть дополнительная space плата при заполнении категорий.

Измените это:

 .populate(' categories')
 

с этим:

 .populate('categories')
 

Комментарии:

1. Спасибо, что пытались мне помочь. Я сделал это, но это все еще не работает. Я создал сообщение в postman, там не было раздела категории, на который я ссылался.

Ответ №2:

В написанной вами схеме есть небольшая проблема,

имя поля-категории, что подразумевает, что оно должно быть массивом идентификаторов объектов категории

например, в сообщении может быть «Технология», «Python» и т. Д…

измените поле категории в схеме записи следующим образом

 categories:[{ type: mongoose.Schema.Types.ObjectId, ref: "Category" }]
 

Причина, по которой вы не можете видеть категории, когда заполняете их в маршруте ПОЛУЧЕНИЯ сообщения, заключается в том, что логика, которую вы написали, предназначена для добавления новой категории, поэтому здесь никогда не говорится, к какой категории относится это сообщение? Вы можете добавить новый маршрут для добавления кетгорий в логику post следующим образом

 //? Adding category to post logic
router.post("/:category_id/:post_id", async (req, res) =>{
    
 try{
    const {category_id, post_id} = req.params//? get the category Id 
                        //?and Post Id from the route params.

    //? Find the post you want to add the category 
    await Post.findByIdAndUpdate(
     {_id:post_id},
     { $push: { categories: category_id } },
     {new:true},
    )
    res.status(200).json(savedCategory)
 }catch(err){
    res.status(500).json(err)
 }
})
 

эта логика добавит идентификатор категории в поле категории в сообщении.

Теперь вы запрашиваете публикацию и заполняете поля категорий, вы получите категории, с которыми связана публикация

Комментарии:

1. О, спасибо, что попытались мне помочь. Я смог решить свою проблему несколько дней назад, так как до сих пор не получал никакой помощи, пока не проверил. Я просто изменил всю систему. Я удалил модель категории. Я использовал только модель публикации вместе с разделом объектов категорий. Я сопоставил в react и выбрал все категории. Я использовал метод javascript для отображения только уникальных значений на боковой панели. Таким образом, у каждого поста были свои категории, и все категории уникальных значений отображались на боковой панели. Я попробую ваш метод, когда захочу реализовать функции комментариев. Я думаю, что это может пригодиться там.