Проблема с. Почта. Схемы комментариев - Mongoose / Typescript - PullRequest
0 голосов
/ 09 мая 2020

Я создаю приложение для социальных сетей, что-то вроде Instagram. Честно говоря, я впервые работаю с нереляционной базой данных, поэтому у меня возникли проблемы с моим logi c. Я не могу понять, как вы сохраняете идентификаторы, которые создают связь между схемами. У меня не было проблем с пользовательским постом. Но у меня есть некоторые ошибки с Post - Comment. Я оставляю части своего кода, чтобы вы могли понять мою проблему. Это моя схема сообщений

    const postSchema = new Schema({
        created: {
            type: Date
        },
        descripcion:{
            type: String,
            required: [true, 'Cada prenda debe ser descrita']
        },
        img: [{
            type: String
        }],
        user: {
            type: Schema.Types.ObjectId,
            ref: 'Usuario',
            required: [true, 'Debe existir una referencia a un usuario']
        }, 
        comment: [{
            type: Schema.Types.ObjectId,
            ref: 'Comentario'
         }]
    });
    interface IPost extends Document{
        created: Date;
        descripcion: string;
        img: string[];
        cords: string;
        user: string;
        comment: string;
}

Это моя схема комментариев:

const comentarioSchema = new Schema({
    created: {
        type: Date
    },
    autor: {
        type: Schema.Types.ObjectId,
        ref: 'Usuario',
        required: [true, 'Debe existir una referencia a un usuario']
    },
    contenido: {
        type:  String,
        required: [true, 'No se aceptan comentarios vacios']
    },
    post:{
      type: Schema.Types.ObjectId,
      ref: 'Post',
      required: [true, 'Debe existir una referencia al post al que este comentario pertenece']
    }
});
interface IComentario extends Document{
    created: Date;
    autor: string;
    contenido: string;
    post: string;
}

Наконец, вот в чем проблема. У меня есть файл под названием Comment.ts (Comentario.ts - На моем родном языке):

import { Router, Response } from "express";
import { verificaToken } from '../middlewares/autenticacion';
import { Comentario } from '../models/comentario.model';
const comentarioRoutes = Router();

comentarioRoutes.post('/',[verificaToken], (req:any, res: Response)=> {

    const body = req.body;
    body.autor = req.usuario._id;
    body.post = req.post._id;

    Comentario.create(body).then( async comentarioDB => {

        await comentarioDB.populate('usuario','-password').populate('post').execPopulate();

        res.json({
            ok:true,
            comentario: comentarioDB
        });
    }).catch(err=> {
        res.json(err)
    });



});

export default comentarioRoutes;

Как я могу автоматически сохранить идентификатор сообщения, я пытался заполнить, используя запрос, но получаю эту ошибку :

TypeError: Невозможно прочитать свойство '_id' неопределенного значения в /Users/mari/Desktop/Projects/ionic/fotos-server/dist/routes/comentario.js:21:26 в Layer.handle [как handle_request] (/Users/mari/Desktop/Projects/ionic/fotos-server/node_modules/express/lib/router/layer.js:95:5) в следующем (/ Users / mari / Desktop / Projects / ionic / fotos-server / node_modules / express / lib / router / route. js: 137: 13) в /Users/mari/Desktop/Projects/ionic/fotos-server/dist/middlewares/autenticacion.js: 12: 9 в processTicksAndRejection (internal / process / task_queues. js: 97: 5)

Не могли бы вы указать мне, в чем моя ошибка, или помочь мне найти лучший подход. Буду очень признателен, если вы мне поможете!

1 Ответ

1 голос
/ 09 мая 2020

Я создал минимальное репо на Github, чтобы продемонстрировать рабочий пример использования populate в соответствии с вашими требованиями.

В README.md я специально для вас обрисовал ряд вещей, объясняя возможные

Я чувствую себя обязанным сказать, что я разработчик-любитель, поэтому относитесь к моему мнению / работе легкомысленно (вероятно, отличается от профессиональных инженеров), хотя этого должно быть достаточно, чтобы вы начали!

В качестве бонуса я включил пример шаблона проектирования «Контроллер-> Сервис-> Модель», поскольку он фокусируется на разделении представления, бизнес-логах c и доступе к данным.

Я старался избегать реализации любых классов, чтобы упростить задачу, хотя я лично рекомендовал бы хотя бы изучить парадигму OOP.

https://github.com/Isolated-/mari-working-mongoose - не стесняйтесь, дайте мне знать, если я могу любая дальнейшая помощь и удачи!

Для тех, кто наткнется на этот ответ с аналогичной проблемой, рабочий код будет выглядеть примерно так:

export const commentController = {
  post: async (req: Request, res: Response) => {
    const body = req.body;
    const { postId, authorId, commentText } = body;

    // implement real validation logic
    if (!postId || !authorId || !commentText) {
      return res.status(400).json({
        error: 'Bad Request',
      });
    }

    const comment = await new Comment({
      post: postId,
      author: authorId,
      content: commentText,
    }).save();

    return res.status(201).json({
      ok: true,
      comment: await comment.populate('author').populate('post').execPopulate(),
    });
  },
};
...