【问题标题】:Type 'Document' is missing the following properties from type类型“文档”缺少类型中的以下属性
【发布时间】:2020-04-09 16:59:00
【问题描述】:

所以我有一个 Node /w Typescript REST API,我有一个注册方法,它创建一个用户并使用创建的用户 firstName、lastName、email 进行响应。

问题是我遇到了这个打字稿错误,上面写着“类型'文档'缺少来自类型'SavedUser'的以下属性:名字,姓氏,电子邮件”。

我相信在我的 SavedUser 界面中添加 mongoose.Document 类型会有所帮助,我不确定,谢谢您的帮助!

错误截图:

示例代码:

    interface SavedUser {
        firstName: string 
        lastName: string
        email: string
    }

    ...

    public async signUp(req: Request, res: Response): Promise<void | Response> {
        const salt: string = await bcrypt.genSalt(10)
        const hashedPassword: string = await bcrypt.hash(req.body.password, salt)

        const user = new User({
            firstName: req.body.firstName,
            lastName: req.body.lastName,
            email: req.body.email,
            password: hashedPassword
        })

        try {
            const { firstName, lastName, email }: SavedUser = await user.save()

            return res.status(200).send({
                firstName,
                lastName,
                email
            })
        } catch (err) {
            return res.status(400).send(err)
        }
    }

【问题讨论】:

  • user.save() 返回什么?

标签: javascript node.js typescript mongoose mongoose-schema


【解决方案1】:

我不知道问题到底出在哪里,但这就是我使用 TypeScript 创建猫鼬模式的方式,它对我有用。

import * as mongoose from 'mongoose';

interface SavedUserDocument extends mongoose.Document {
    firstName: string;
    lastName: string;
    email: string;
}

const SavedUserSchema = new mongoose.Schema({...});
export const SavedUser = mongoose.model<SavedUserDocument>('saveduser', SavedUserSchema);

希望它也对你有用。

【讨论】:

    【解决方案2】:

    Mongoose 在 .save() 上返回更多,然后您当前使用 SavedUser 界面指定。

    从 Mongoose 获取所有类型的最简单方法是使用导出的 Document 并扩展您的界面。

    import { Document } from 'mongoose';
    
    export interface SavedUser extends Document {
      email: string;
      firstName: string;
      lastName: string;
    }
    

    【讨论】:

      【解决方案3】:

      感谢您的回答,我解决了!我混合了dijkstraphw 的答案并想出了这个:

      在我的用户模型中

      //user.ts

      import { Schema, model, Document } from 'mongoose'
      
      const userSchema = new Schema({
          firstName: {
              type: String,
              required: true,
              min: 2,
              max: 255
          },
      
          lastName: {
              type: String,
              required: true,
              min: 2,
              max: 255
          },
      
          email: {
              type: String,
              required: true,
              unique: true,
              min: 6,
              max: 255
          }
      })
      
      export interface SavedUserDocument extends Document {
          firstName: string;
          lastName: string;
      }
      
      export const userSchemaModel = model<SavedUserDocument>('User', userSchema)
      
      

      现在在我的用户控制器上:

      //user.ts

      import { userSchemaModel, SavedUserDocument } from '../../models/user/user'
      ...
          public async signUp(req: Request, res: Response): Promise<void | Response> {
              const user = new userSchemaModel({
                  firstName: req.body.firstName,
                  lastName: req.body.lastName,
                  email: req.body.email
              })
      
              try {
                  const { firstName, lastName }: SavedUserDocument = await user.save()
      
                  return res.status(200).send({
                      firstName,
                      lastName,
                      message: 'User created'
                  })
              } catch (err) {
                  return res.status(400).send(err)
              }
          }
      ...
      

      我确实有一个问题;

      如果我删除了model&lt;SavedUserDocument&gt;('User', userSchema) 中的&lt;SavedUserDocument&gt;,我仍然会收到错误消息,我可以对此有一个很好的解释吗?我对 Typescript 还是比较陌生,希望能得到解释,非常感谢!

      【讨论】:

        猜你喜欢
        • 2021-04-20
        • 2021-07-29
        • 1970-01-01
        • 2020-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-11
        • 1970-01-01
        相关资源
        最近更新 更多