Mongoose getter未生效问题:查询返回数据未触发getter转换
问题原因
你对Mongoose getter的作用理解是完全正确的:getter不会修改数据库存储的原始数据,仅在读取字段时做展示层面的转换,未触发是默认配置导致的。
Mongoose的getter默认仅在直接访问文档属性(例如user.password)时触发,当你调用res.json()返回查询结果时,Mongoose会自动调用文档的toJSON()方法做序列化,而该方法默认是不启用getter逻辑的,因此你定义的passwordReveal函数全程没有执行。
解决方法
提供两种可选方案,按需选择即可:
方案1:Schema全局开启JSON序列化getter(推荐)
修改Schema定义时的配置,在mongoose.Schema的第二个参数中添加toJSON配置,开启getter:
// Creating my model const UserSchema = mongoose.Schema({ name: { type: String }, password: { type: String, set: autoChangePassword, get: passwordReveal } }, { // 新增这行配置,JSON序列化时自动调用所有字段的getter toJSON: { getters: true } })
修改后原有接口代码不需要做任何改动,返回结果就会自动应用getter的转换逻辑。
方案2:单次查询手动开启getter
如果不想全局开启配置,仅想在本次查询中生效,可以在返回结果前手动调用toJSON()并传入参数:
// Allows me to view all my users app.get('/user/view', async (req, res) => { const findUser = await User.find() // 手动对每个文档做序列化,开启getter const result = findUser.map(user => user.toJSON({ getters: true })) return res.json(result) })
补充说明
如果开启getter之后需要获取数据库中存储的原始值,可以调用如下方法:
// 第二个参数传null,第三个参数关闭getter即可拿到原始存储值 const rawPassword = user.get('password', null, { getters: false })
内容的提问来源于stack exchange,提问作者easymoney
相关产品推荐
相关产品推荐

