Nodejs关于Mongoose的一个问题

Nodejs关于Mongoose的一个问题

在定义Schema的时候,给一个属性定义了get方法,即getter. 但是在读取数据的时候,getter方法不被调用。参考官方文档,的例子也没用。

var updateTimeGetter = function(v){ console.log("type : " + typeof v); return “2013-12-12”; };

var MyServiceSchema = new Schema({ updateTime: {type: Date, default: Date.now, get: updateTimeGetter} });


3 回复

Node.js 关于 Mongoose 的一个问题

在使用 Mongoose 定义 Schema 时,有时候我们希望在读取某个字段时能够执行特定的逻辑(例如格式化日期),这时可以使用 get 方法(也称为 getter)。然而,在实际操作中,你可能会遇到 get 方法没有被调用的情况。

示例代码

假设我们有一个 MyService 模型,并且希望在读取 updateTime 字段时输出一条日志信息并返回固定的字符串 "2013-12-12"

const mongoose = require('mongoose');
const { Schema } = mongoose;

// 定义更新时间的 getter 方法
var updateTimeGetter = function(v) {
    console.log("type : " + typeof v); // 应该打印出 Date 类型
    return "2013-12-12";
};

// 定义 Schema
const MyServiceSchema = new Schema({
    updateTime: { type: Date, default: Date.now, get: updateTimeGetter }
});

// 创建模型
const MyService = mongoose.model('MyService', MyServiceSchema);

// 连接 MongoDB
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true, useUnifiedTopology: true });

// 测试代码
(async () => {
    const service = new MyService();
    await service.save();

    // 读取数据
    const fetchedService = await MyService.findById(service._id);
    console.log(fetchedService.updateTime); // 应该触发 getter 方法并打印出 "2013-12-12"
})();

解释

  1. 定义 getter 方法updateTimeGetter 函数用于处理 updateTime 字段的读取逻辑。

  2. 定义 Schema:在 MyServiceSchema 中定义 updateTime 字段,并设置 get 属性为 updateTimeGetter

  3. 创建模型:使用定义好的 Schema 创建一个 Mongoose 模型 MyService

  4. 连接数据库:使用 mongoose.connect 方法连接到 MongoDB 数据库。

  5. 测试代码

    • 创建一个新的 MyService 实例并保存到数据库。
    • 通过 _id 查找刚刚保存的数据。
    • 输出 fetchedService.updateTime,这应该会触发 updateTimeGetter 方法并返回 "2013-12-12"

常见问题及解决方案

  • 确保 mongoose 版本支持 get 方法。
  • 确认 get 方法正确地添加到了 Schema 中。
  • 在读取数据时,确保使用的是 Mongoose 的方法(如 findById),而不是直接从数据库中获取原始数据。

如果上述步骤仍然无法解决问题,请检查是否有其他中间件或插件影响了数据的读取过程。


使用 virtual 吧!

在使用 Mongoose 定义 Schema 的时候,如果为某个属性定义了 getter 方法,但该方法在读取数据时没有被调用,可能是因为 Mongoose 的 getter 方法在某些情况下不会自动触发。以下是一些常见的原因和解决方法:

  1. 确保 getter 被正确注册:确保你在定义 Schema 时正确地注册了 getter 方法。
  2. 确认数据是否经过 Mongoose 处理:如果你直接从数据库中获取原始数据,而不是通过 Mongoose 查询模型实例,那么 getter 方法不会被调用。你需要确保你是在处理 Mongoose 模型实例而不是原始数据。

下面是一个完整的示例,展示如何正确设置和使用 getter 方法:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// 确保你已经连接到 MongoDB 数据库
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });

// 定义 Schema
var updateTimeGetter = function(v) {
    console.log("type : " + typeof v);
    return "2013-12-12";
};

var MyServiceSchema = new Schema({
    updateTime: { type: Date, default: Date.now, get: updateTimeGetter }
});

// 创建模型
const MyService = mongoose.model('MyService', MyServiceSchema);

// 插入数据并查询
async function run() {
    await MyService.create({ updateTime: new Date() });
    
    // 查询数据
    const service = await MyService.findOne();
    console.log(service.updateTime); // 应该看到输出 "2013-12-12"
}

run().catch(console.error);

在这个示例中,我们定义了一个 updateTime 字段,并为其添加了一个 getter 方法 updateTimeGetter。当我们查询数据时,updateTimeGetter 方法会被调用,输出更新时间并返回格式化后的字符串。

确保你的 Mongoose 版本支持 getter 方法(Mongoose 4.x 及以上版本)。如果问题仍然存在,请检查是否有其他中间件或配置影响了 getter 的行为。

回到顶部