类型“文档”缺少类型的以下属性

时间:2019-12-17 08:15:02

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

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

问题是我遇到此打字稿错误,提示“类型'文档'缺少类型'保存的用户'的以下属性:名字,姓氏,电子邮件”。

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

错误屏幕截图: enter image description here

示例代码:

    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)
        }
    }

3 个答案:

答案 0 :(得分:0)

我不知道确切的问题出在哪里,但这是我如何使用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);

希望它也对您有用。

答案 1 :(得分:0)

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

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

import { Document } from 'mongoose';

export interface SavedUser extends Document {
  email: string;
  firstName: string;
  lastName: string;
}

答案 2 :(得分:0)

感谢您的回答,我解决了!我混合了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)
        }
    }
...

我有一个问题;

如果我删除了<SavedUserDocument>中的model<SavedUserDocument>('User', userSchema),我仍然会收到错误消息,请问我对此有很好的解释吗?我对Typescript还是比较陌生,很高兴得到一个解释,非常感谢!