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

使用React+Express+MongoDB开发时无法向数组字段写入数据怎么解决

问题原因排查及解决方案

核心错误点

  • 未执行持久化保存操作:你修改visitor和user对象的数组字段后,没有调用Mongoose文档的save()方法,修改仅存在于服务端内存,不会写入MongoDB数据库。
  • 变量未定义错误:代码中user.followers.push(me._id)的me变量不存在,应该替换为visitor._id。
  • user对象类型错误:查询user时使用了.lean()方法,该方法返回纯JSON对象而非Mongoose文档实例,无法调用save()方法完成数据写入。
  • 数组字段配置缺失:Schema中Array类型未指定默认值时初始为undefined,直接调用push方法会抛出异常,建议补充默认空数组配置。

修复后的代码

修正用户Schema

const UserSchema = new mongoose.Schema(
    {
        username: { type: String, required: true, unique: true },
        password: { type: String, required: true },
        email: { type: String, required: true, unique: true},
        followers: { type: Array, required: false, default: [] },
        following: { type: Array, required: false, default: [] },
        likes: { type: Array, required: false, default: []},
    },
    { collection: 'users' }
)

修正关注接口代码

app.post('/api/follow', async (req, res) => {
    const {token, username} = req.body

    if (token === null)
    {
        return res.json({status: 'error'})
    }

    // 去掉lean(),返回Mongoose文档实例
    const user = await User.findOne({username})
    const _visitor = jwt.verify(token, JWT_SECRET)
    const visitor = await User.findOne({username: _visitor.username})
    if (!user)
    {
        return res.json({status: 'error', error: 'User not found.'})
    }
    if (!visitor)
    {
        return res.json({status: 'error', error: 'User not found.'})
    }

    // 修复变量引用错误
    visitor.following.push(user._id)
    user.followers.push(visitor._id)
    // 新增保存操作,并行执行提升接口响应速度
    await Promise.all([visitor.save(), user.save()])

    return res.json({status: 'ok'})
})

额外优化建议

  • 新增重复关注校验逻辑:push前先判断visitor.following.includes(user._id),避免数组中存入重复的用户ID。
  • 数组字段可指定为[mongoose.Schema.Types.ObjectId]并关联User集合,方便后续做关联查询。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 20:45:03