You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js+Express中向MongoDB的StudentSchema添加收藏教师ID?

问题描述

我希望实现学生点击「添加收藏教师」按钮时,将指定教师的ID保存到Student Schema的teacher数组字段中。

现有Schema代码

Student Schema

const mongoose = require ('mongoose')
const studentSchema=new mongoose.Schema({
    name:{type:String,required:true}, 
    email:{type:String,required:true}, 
    phone:{type:String,required:true}, 
    password:{type:String,required:true},
    teacher : [{type : mongoose.Schema.Types.ObjectID , ref:'teachers'}],
})

const studentModel = mongoose.model('students',studentSchema)
module.exports=studentModel

Teacher Schema

const mongoose = require ('mongoose')

const teacherSchema=new mongoose.Schema({
    name:{type:String,required:true}, 
    email:{type:String,required:true}, 
    phone:{type:String,required:true}, 
    password:{type:String,required:true}, 
})

const teacherModel = mongoose.model('teachers',teacherSchema)
module.exports=teacherModel

请问实现该功能的后端路由代码是什么?


实现方案(基于Express)

假设你使用Express框架,以下是实现收藏教师功能的后端路由代码,包含基础校验和重复收藏拦截:

1. 引入依赖与模型

const express = require('express');
const router = express.Router();
const Student = require('../models/studentModel'); // 替换为你的Student模型实际路径
const Teacher = require('../models/teacherModel'); // 替换为你的Teacher模型实际路径

2. 收藏教师核心路由

// 学生添加收藏教师接口
router.post('/students/:studentId/favorite-teacher', async (req, res) => {
    try {
        const { studentId } = req.params;
        const { teacherId } = req.body;

        // 校验目标教师是否存在
        const targetTeacher = await Teacher.findById(teacherId);
        if (!targetTeacher) {
            return res.status(404).json({ message: '教师不存在' });
        }

        // 找到学生并添加收藏($addToSet避免重复收藏)
        const updatedStudent = await Student.findByIdAndUpdate(
            studentId,
            { $addToSet: { teacher: teacherId } },
            { new: true, runValidators: true } // 返回更新后的数据,执行Schema校验
        ).populate('teacher'); // 可选:关联查询教师详情,返回完整信息

        if (!updatedStudent) {
            return res.status(404).json({ message: '学生不存在' });
        }

        res.status(200).json({
            message: '收藏成功',
            data: updatedStudent
        });
    } catch (error) {
        console.error(error);
        res.status(500).json({ message: '服务器内部错误' });
    }
});

额外说明

  • 使用$addToSet替代$push,可以防止学生重复收藏同一教师,避免数组出现重复ID。
  • populate('teacher')可自动关联查询教师的完整信息,无需前端单独请求教师数据。
  • 生产环境中建议从登录态(如JWT解析结果)获取studentId,而非URL参数,避免非法操作他人收藏列表。
  • 需添加身份验证中间件(如JWT校验),确保只有学生本人能操作自己的收藏数据。

内容的提问来源于stack exchange,提问作者Arijit das

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:20:40