Mongoose:自动添加时间戳引发错误 $__isSelected 不是函数
Posted
技术标签:
【中文标题】Mongoose:自动添加时间戳引发错误 $__isSelected 不是函数【英文标题】:Mongoose: Auto add Timestamps is raising an error $__isSelected is not a function 【发布时间】:2021-08-07 07:48:04 【问题描述】:我正在尝试将一些数据保存到猫鼬集合中,并希望自动插入“createdAt”和“updatedAt”字段。因此,我添加了 timestamps: true 作为架构中的第二个参数
这是我的模型架构
"use strict";
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const notificationSchema = new Schema(
type: String,
author: String,
metadata: Object,
link: String
,
timestamps: true
);
module.exports = notificationSchema;
这就是我插入记录的方式
try
const notification = new Notification(
type: "user",
author: "phantom",
metadata:
filename: "internet.png"
,
link: "http://yahoo.com"
);
const r = await notification.save();
console.log(`r`, r);
catch (error)
console.error(error);
但是我得到这个错误并且数据没有保存
this.$__isSelected 不是函数
堆栈跟踪:
TypeError: this.$__isSelected is not a function
at model.<anonymous> (/Users/phantom/projects/personal/backend/service1/node_modules/mongoose/lib/helpers/timestamps/setupTimestamps.js:54:69)
at callMiddlewareFunction (/Users/phantom/projects/personal/backend/service1/src/submodules/node_modules/kareem/index.js:483:23)
at model.next (/Users/phantom/projects/personal/backend/service1/src/submodules/node_modules/kareem/index.js:58:7)
at _next (/Users/phantom/projects/personal/backend/service1/src/submodules/node_modules/kareem/index.js:107:10)
at /Users/phantom/projects/personal/backend/service1/src/submodules/node_modules/kareem/index.js:508:38
at processTicksAndRejections (internal/process/task_queues.js:79:11)
当我在 node_modules/mongoose/lib/helpers/timestamps/setupTimestamps.js 中挖掘 setupTimestamps.js 文件时,我看到了这段代码,它确实对我没有任何意义
if (!skipCreatedAt && createdAt && !this.get(createdAt) && this.$__isSelected(createdAt))
this.$set(createdAt, auto_id ? this._id.getTimestamp() : defaultTimestamp);
当我创建 timestamps: false 时,记录会被插入而没有任何错误。我希望 mongoose 自动创建 createdAt 和 modifiedAt 字段。
以前有没有人遇到过这个错误,你是如何解决这个问题的?
【问题讨论】:
【参考方案1】:timestamp
存在于saveOptions
对象中,因此我们可以跳过此保存的时间戳。
try
const notification = new Notification(
type: "user",
author: "phantom",
metadata:
filename: "internet.png"
,
link: "http://yahoo.com"
);
const r = await notification.save( timestamps: false );
console.log(`r`, r);
catch (error)
console.error(error);
来源:https://github.com/Automattic/mongoose/issues/7960 https://mongoosejs.com/docs/guide.html#timestamps
【讨论】:
将其设置为 false 不会创建 createdAt 和 updatedAt 字段,我希望创建它们 你用的是哪个猫鼬版本? 我使用的是猫鼬版本 5.11.8以上是关于Mongoose:自动添加时间戳引发错误 $__isSelected 不是函数的主要内容,如果未能解决你的问题,请参考以下文章