“文档”类型上不存在猫鼬属性“x”

xer*_*ant 11 mongodb node.js express typescript

ts 编译器说“文档”类型不存在任何属性。

似乎因此无法设置模型上的任何属性。如果我将用户对象打印到控制台,我得到的只是 {"_id":"long hex id number"}

我的模型配置如下:

用户.ts

import * as mongoose from 'mongoose';
import * as crypto from 'crypto';
import * as jwt from 'jsonwebtoken';

var userSchema = new mongoose.Schema({
    email: {
        type: String,
        unique: true,
        required: true
    },
    firstMidname: {
        type: String,
        required: true
    },
    lastName: {
        type: String,
        required: true
    },
    hash: String,
    salt: String
});

userSchema.methods.setPassword = setPassword;


userSchema.methods.validPassword = validPassword;

userSchema.methods.generateJwt = generateJwt;

export = mongoose.model('User', userSchema);
Run Code Online (Sandbox Code Playgroud)

api连接点api.ts

import * as express from    'express';
import * as mongoose from   'mongoose';
import * as passport from   'passport';

var User = mongoose.model('User');

var router = express.Router();

router.post('/', createUser);

function createUser(req, res){
var user = new User();
    console.log(user);
    user.firstMidName = req.body.firstName;
    user.lastName = req.body.lastName;
    user.setPassword(req.body.password);

    user.save((err) => {
        console.log("saving user");
        var token;
        token = user.generateJwt();
        res.status(200);
        res.json({
            'token': token
        });
    });
}

export = router;
Run Code Online (Sandbox Code Playgroud)

如何修复或解决此问题?user.save块中的任何内容都不会执行。

编辑:这两件事似乎无关。我现在可以保存到数据库但是打字稿错误仍然存​​在。这是预期的行为吗?

小智 12

mongoose.model方法接受默认为 的类型,该类型mongoose.Document不会在User文档中包含您想要的属性。

要解决此问题,请创建一个描述您的架构和扩展的接口mongoose.Document

export interface UserDoc extends mongoose.Document {
  email: {
    type: string;
    unique: boolean;
    required: boolean;
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后,将其作为模型的类型传递:

export = mongoose.model<UserDoc>('User', userSchema);