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} });
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"
})();
解释
-
定义 getter 方法:
updateTimeGetter
函数用于处理updateTime
字段的读取逻辑。 -
定义 Schema:在
MyServiceSchema
中定义updateTime
字段,并设置get
属性为updateTimeGetter
。 -
创建模型:使用定义好的 Schema 创建一个 Mongoose 模型
MyService
。 -
连接数据库:使用
mongoose.connect
方法连接到 MongoDB 数据库。 -
测试代码:
- 创建一个新的
MyService
实例并保存到数据库。 - 通过
_id
查找刚刚保存的数据。 - 输出
fetchedService.updateTime
,这应该会触发updateTimeGetter
方法并返回"2013-12-12"
。
- 创建一个新的
常见问题及解决方案
- 确保
mongoose
版本支持get
方法。 - 确认
get
方法正确地添加到了 Schema 中。 - 在读取数据时,确保使用的是 Mongoose 的方法(如
findById
),而不是直接从数据库中获取原始数据。
如果上述步骤仍然无法解决问题,请检查是否有其他中间件或插件影响了数据的读取过程。
使用 virtual 吧!
在使用 Mongoose 定义 Schema 的时候,如果为某个属性定义了 getter 方法,但该方法在读取数据时没有被调用,可能是因为 Mongoose 的 getter 方法在某些情况下不会自动触发。以下是一些常见的原因和解决方法:
- 确保 getter 被正确注册:确保你在定义 Schema 时正确地注册了 getter 方法。
- 确认数据是否经过 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 的行为。