expressjs при наборе Typescript goose - PullRequest
0 голосов
/ 15 января 2020

Здравствуйте, я пытаюсь заполнить два документа в моем проекте Express. Я создаю Classroomschema, и она имеет ссылку на Instructorschema.

import * as mongoose from 'mongoose';
const Schema = mongoose.Schema;
import { IClassRoom } from '../interface/IClassRoom';

const ClassRoomSchema = new Schema({
    instructor: {
        ref: 'Instructor',
        type: Schema.Types.ObjectId
    },
    classRoomName: {
        type: String,
        required: true
    },
    classRoomDescription: {
        type: String,
        required: true
    },
    creationDate: {
        type: Date,
        default: Date.now
    },
    classRoomGenre: {
        type: String,
        required: true
    },
    classRoomSkills: {
        type: String,
        required: true
    },
    classRoomVideo: {
        type: String,
    },
    classRoomLevel: {
        type: String
    }
});

const ClassRoomModel = mongoose.model<IClassRoom>('Classroom', ClassRoomSchema);
export default ClassRoomModel;

Я создал интерфейс каждой из моих схем. затем я создал запрос интерфейса с типом интерфейса Instructor

import { Request } from 'express';
import { Instructor } from './IInstructor';

export interface RequestWithInstructor extends Request {
    instructor: Instructor;
}

Я вызываю интерфейс в моем контроллере classRoom, поскольку я хочу добавить класс с контроллером, на консоли я получаю ошибку UnhandledPromiseRejectionWarning: Ошибка типа: невозможно прочитать свойство '_id' из неопределенного. Я хочу знать, может ли кто-нибудь помочь мне. это код

import { Request, Response } from 'express';
import ClassRoomModel from '../model/ClassRoomModel';
import InstructorModel from '../model/InstructorModel';
import { RequestWithInstructor } from '../interface/RequestC';

export class ClassRoomController {

    public getAllClassRoom = async (req: Request, res: Response) => {
        const classRoom = await ClassRoomModel.find()
        res.json(classRoom);
    }


    public addClassRoom = async (req: RequestWithInstructor, res: Response) => {

        const instructorid = req.instructor._id;

        const classbody = req.body;

        const instructor = await InstructorModel.findById(instructorid);

        const newClassRoom = new ClassRoomModel({
            ...classbody,
            classRoomVideo: req.file.path,
            instructor: instructor
        });

        const savedClassRoom = await newClassRoom.save();

        res.json(savedClassRoom);
    }

1 Ответ

0 голосов
/ 17 января 2020

Строка, которая в данный момент выдает ошибку:

const instructorid = req.instructor._id;

Это потому, что req на самом деле не RequestWithInstructor, а Request, предоставленный вам express. Вам нужно извлечь body из него, прежде чем продолжить работу с логами c.

Следовательно, подпись должна быть:

public addClassRoom = async (req: Request, res: Response)

Предполагая, что addClassRoom является методом, вызываемым при вызове API POST или PUT эта строка понадобится перед извлечением поля _id.

const classbody = req.body;

Предполагается, что тело должно быть объектом JSON, соответствующим IClassRoom интерфейс, вы можете либо привести тип к типу, а затем проверить его, например,

const classRoom = req.body as IClassRoom;

, либо вы можете превратить интерфейс в класс с конструктором (хотя это может не сработать с Mon goose), и в идеале добавьте метод проверки, который вы затем вызвали бы из контроллера, например:

const classRoom = new ClassRoom(req.body);
if (!classRoom.validate()) {
   throw new Error('Invalid ClassRoom object');
}

Затем вы можете получить instructorId как classRoom.instructor._id, если он находится там, где он должен быть в JSON body.

Работа функции контроллера API должна состоять в том, чтобы взять JSON и проверить его, прежде чем он сможет выполнять взаимодействие Mon goose.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...