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

MERN项目中如何在MongoDB关联用户发布记录 实现仅所有者可删自有车辆广告

MERN项目车辆广告删除权限控制实现指引

步骤1:调整Schema关联用户与广告

首先需要在车辆广告Schema中新增publisher字段,关联对应用户的_id,建立用户和广告的从属关系。
示例代码:

// 车辆广告Schema
const mongoose = require('mongoose')
const vehicleAdSchema = new mongoose.Schema({
  title: String,
  vehicleDetails: Object,
  price: Number,
  // 新增发布者关联字段
  publisher: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User',
    required: true
  }
})
const VehicleAd = mongoose.model('VehicleAd', vehicleAdSchema)

如果需要双向关联,可在用户Schema中新增广告列表字段(非强制):

// 用户Schema新增字段
publishedAds: [{
  type: mongoose.Schema.Types.ObjectId,
  ref: 'VehicleAd'
}]

步骤2:发布广告时存储发布者ID

你需要先实现用户登录鉴权逻辑(通常为JWT校验中间件),所有需要登录的接口经过中间件校验后,会将当前登录用户信息挂载到req.user对象上。发布广告时,自动将当前登录用户的ID存入publisher字段:

// 发布广告接口示例
app.post('/api/vehicle-ads', authMiddleware, async (req, res) => {
  const newAd = new VehicleAd({
    ...req.body,
    publisher: req.user._id
  })
  await newAd.save()
  // 双向关联场景下同步更新用户的广告列表
  await mongoose.model('User').findByIdAndUpdate(
    req.user._id,
    { $push: { publishedAds: newAd._id } }
  )
  res.status(201).json(newAd)
})

步骤3:删除接口添加权限校验

删除广告前,先查询目标广告的发布者ID,和当前登录用户ID比对,一致才允许执行删除操作:

// 删除广告接口示例
app.delete('/api/vehicle-ads/:adId', authMiddleware, async (req, res) => {
  try {
    const targetAd = await VehicleAd.findById(req.params.adId)
    if (!targetAd) {
      return res.status(404).json({ msg: '目标广告不存在' })
    }
    // 核心权限校验,注意需将ObjectId转为字符串比对
    if (targetAd.publisher.toString() !== req.user._id.toString()) {
      return res.status(403).json({ msg: '无权限删除该广告' })
    }
    // 校验通过,执行删除
    await VehicleAd.findByIdAndDelete(req.params.adId)
    // 双向关联场景下同步更新用户的广告列表
    await mongoose.model('User').findByIdAndUpdate(
      req.user._id,
      { $pull: { publishedAds: req.params.adId } }
    )
    res.status(200).json({ msg: '删除成功' })
  } catch (err) {
    res.status(500).json({ msg: '服务器错误' })
  }
})

补充优化建议

  • 可将权限校验逻辑抽为独立的checkAdOwner中间件,复用于广告编辑、删除等所有需要校验所有者的接口
  • 前端可增加体验优化:仅当前登录用户为广告发布者时,才显示删除/编辑按钮,但前端控制仅为体验优化,后端校验是必须环节,不可省略
  • 关联数据的同步更新可使用Mongoose的pre/post中间件统一处理,避免在每个接口中重复编写逻辑

内容的提问来源于stack exchange,提问作者AHMAD IRSHAD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:36:00