node.js - 使用 Typescript mongoose 填充的 expressjs
问题描述
您好,我正在尝试在我的 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: Cannot read property '_id' of undefined。我想知道是否有人可以帮助我。这是代码
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
实际上不是 a RequestWithInstructor
,而是 aRequest
通过 express 提供给您的。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),并且理想情况下添加一个 validate 方法,然后您将从控制器调用该方法,例如:
const classRoom = new ClassRoom(req.body);
if (!classRoom.validate()) {
throw new Error('Invalid ClassRoom object');
}
然后,您可以获取instructorId
类似classRoom.instructor._id
JSON 正文中的预期内容。
您的 API 控制器函数的工作应该是接收 JSON 并在它可以进行 Mongoose 交互之前对其进行验证。
推荐阅读
- python - 处理由 Python 中的 bin 表示的分类缺失值?
- c++ - 如何使用模板和 const 关键字处理指向类型?
- amazon-web-services - 不使用分区键查询 DynamoDB 表的全局二级索引
- python - django模型文件字段中的默认图像?
- javascript - 为什么使用 google oauath isSignedIn,listen()?
- python - 当子句卡住时,pyspark big
- python - 手动插入框架设置滚动条不起作用 tkinter
- javascript - 按内容查找 div
- reactjs - React - 找不到模块 - 好像目录不存在
- xamarin.forms - MonoAndroid90 的指定语言目标缺失。确保为“MonoAndroid”安装了正确的工具