【问题标题】:Typescript error when I try to use mongoose methods当我尝试使用猫鼬方法时出现打字稿错误
【发布时间】:2021-03-09 20:44:57
【问题描述】:

我有一个用户界面:

import {Document} from "mongoose";

export interface IUser extends Document{
    email: string;
    password: string;
    strategy: string;
    userId: string;
    isValidPassword(password: string): boolean;
}

还有一个架构:

import { IUser } from "../interfaces/User";

const userSchema = new Schema({
  strategy: {
    type: String,
    enum: ["local", "facebook", "google"]
  },
  email: {
    type: String,
    lowercase: true
  },
  password: {
    type: String
  },
  userId: {
    type: String
  }
});
const User = mongoose.model<IUser>("user", userSchema);

现在当我尝试使用时:

const user :IUser= User.findOne({email});
        if(!user){
            done(null, false)
        }
        user.isValidPassword(password);

它说“TS2740:类型'DocumentQuery'缺少来自类型'IUser'的以下属性:电子邮件、密码、策略、用户ID和另外53个。”

如果我尝试从 const user :IUser= User.findOne({email}); 中删除“IUser”。它不允许我使用user.isValidPassword(password);

我不想为用户使用any 类型。

【问题讨论】:

    标签: javascript node.js typescript express mongoose


    【解决方案1】:

    您应该使用await Model.findOne() 语句查询user 文档,请参阅Model.findOne()

    它将返回user,类型为IUser | null

    然后,您可以拨打Instance methods - user.isValidPassword(password)

    一个工作示例:

    user.ts:

    import { Document, Schema, model } from 'mongoose';
    
    interface IUser extends Document {
      email: string;
      password: string;
      strategy: string;
      userId: string;
      isValidPassword(password: string): boolean;
    }
    
    const userSchema = new Schema({
      strategy: {
        type: String,
        enum: ['local', 'facebook', 'google'],
      },
      email: {
        type: String,
        lowercase: true,
      },
      password: {
        type: String,
      },
      userId: {
        type: String,
      },
    });
    const User = model<IUser>('user', userSchema);
    
    export { User, IUser };
    

    main.ts:

    import { IUser, User } from './user';
    
    async function main() {
      const email = 'teresa.teng@gmail.com';
      const password = '123';
      const user: IUser | null = await User.findOne({ email });
      if (!user) {
        return;
      }
      user.isValidPassword(password);
    }
    

    【讨论】:

    • 我正在使用模型本身查询文档。在代码中 const user :IUser= User.findOne({email}); if(!user){ done(null, false) } user.isValidPassword(password);我从import User from '../models/user'获得用户
    猜你喜欢
    • 2016-06-14
    • 2020-07-09
    • 2016-04-01
    • 1970-01-01
    • 2021-03-13
    • 2020-09-11
    • 2021-04-08
    • 2020-06-21
    • 2012-02-02
    相关资源
    最近更新 更多