簡體   English   中英

帶有 Typescript 貓鼬填充的 expressjs

[英]expressjs with Typescript mongoose populating

您好,我正在嘗試在我的 Express 項目中填充兩個文檔。 我正在創建一個 Classroomschema ,它有一個對教師模式的引用。

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:TypeError:無法讀取未定義的屬性“_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);
    }

當前拋出錯誤的行是:

const instructorid = req.instructor._id;

這是因為req實際上不是RequestWithInstructor ,而是通過 express 提供給您的Request 在繼續您的邏輯之前,您需要從中提取body

因此,簽名應該是:

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

假設addClassRoom是一個由 POST 或 PUT API 調用調用的方法,您將需要在提取_id字段之前執行此行。

const classbody = req.body;

假設主體應該是符合IClassRoom接口的 JSON 對象,您可以轉換類型然后進行驗證,例如

const classRoom = req.body as IClassRoom;

或者您可以將接口轉換為帶有構造函數的類(盡管這可能不適用於 Mongoose),並理想地添加一個驗證方法,然后您將從控制器調用該方法,例如:

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

然后你就可以獲取instructorIdclassRoom.instructor._id如果這就是它的預期是在JSON體。

您的 API 控制器函數的工作應該是接收 JSON 並在它可以進行 Mongoose 交互之前對其進行驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM