如何在打字稿中的猫鼬userschema.methods中使用“this”

Posted

技术标签:

【中文标题】如何在打字稿中的猫鼬userschema.methods中使用“this”【英文标题】:how to use "this" inside mongoose userschema.methods in typescript 【发布时间】:2021-04-18 05:17:40 【问题描述】:

我正在使用带有 typescript 和 jsonwebtoken 的猫鼬来创建登录 api。我是打字稿的新手。在 user.model 中,我无法使用“this”方法访问任何架构属性。例如,user.methods 给我一个编译错误“'Document'.ts(2339) 类型上不存在属性'tokens'”。

export interface IUser extends Document 
    name:string,
    email: string;
    password: string;
    tokens: token: string[],
    encryptPassword(password:string): Promise<string>;
    validatePassword(password:String): Promise<boolean>;

const userSchema  = new Schema(
    name: 
        type: String,
        required: true,
        trim: true
    ,
    email: 
        type: String,
        unique: true,
        required: true
    ,
    password:
        type:String,
        required: true,
        minlength: 5,
        trim: true
    ,
    tokens: [
        token: 
            type: String,
            required: true
        
    ]
)
userSchema.methods.generateAuthToken = async function () 
    const user = this
    const token = jwt.sign(_id: user._id.toString() , "thisismysecretkey")
    user.tokens  = this.tokens.concat(token)

在 userSchema.generateAuthToken 中,当我使用 user.tokens 或 this.tokens 时,我得到的属性 'tokens' 不存在于类型 'Document' 上。请告诉我我做错了什么。提前致谢

【问题讨论】:

【参考方案1】:

尝试提供明确的this 参数。欲了解更多信息,请参阅this parameters

import  Schema, Document  from 'mongoose';

export interface IUser extends Document 
  name: string;
  email: string;
  password: string;
  tokens:  token: string [];
  encryptPassword(password: string): Promise<string>;
  validatePassword(password: String): Promise<boolean>;

const userSchema = new Schema(
  name: 
    type: String,
    required: true,
    trim: true,
  ,
  email: 
    type: String,
    unique: true,
    required: true,
  ,
  password: 
    type: String,
    required: true,
    minlength: 5,
    trim: true,
  ,
  tokens: [
    
      token: 
        type: String,
        required: true,
      ,
    ,
  ],
);
userSchema.methods.generateAuthToken = async function (this: IUser) 
  const user = this;
  const token = user._id.toString() + 'thisismysecretkey';
  user.tokens = this.tokens.concat( token );
;

软件包版本:

"mongoose": "^5.11.9",
"typescript": "^3.7.2"

【讨论】:

以上是关于如何在打字稿中的猫鼬userschema.methods中使用“this”的主要内容,如果未能解决你的问题,请参考以下文章

根据打字稿中的请求参数设置猫鼬的查询过滤器

预中间件中的猫鼬打字稿不存在

在打字稿中使用猫鼬填充查询

尝试在打字稿中使用猫鼬和 bcrypt 比较密码

在带有 loadClass 的打字稿中使用 es6 类和猫鼬

带有打字稿的猫鼬,来自猫鼬的错误“连接”