使用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
相关产品推荐
相关产品推荐

