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 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

mongoose 和 typescript 如何自动将 '_id' 转换为 'id'?

Mongoose 错误:无法同时更新 __v 和 __v

Mongoose 错误:无法同时更新 __v 和 __v

Mongoose 为所有嵌套对象添加 _id

Mongoose 为所有嵌套对象添加 _id

没有生成自动_id