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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:30:00