【问题标题】:Mongoose Property 'x' does not exist on type 'Document'“文档”类型上不存在猫鼬属性“x”
【发布时间】:2017-07-05 15:32:14
【问题描述】:

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

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

我的模型配置如下:

users.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);

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;

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

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

【问题讨论】:

  • user.generateJwt();函数不是异步的吗?
  • 不是。我只是从简洁中截断了它。此外,线路保存用户从不登录,这让我认为这还不足以让 generateJwt 成为问题
  • @xerocompatible 你是怎么解决这个问题的?
  • 我不确定。从那以后我一直在使用 typescript 和 mongoose,但我在最近的项目中使用了 typegoose

标签: node.js mongodb express typescript


【解决方案1】:

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

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

export interface UserDoc extends mongoose.Document {
  email: {
    type: string;
    unique: boolean;
    required: boolean;
  }
  ...
}

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

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

【讨论】:

  • 应该像export interface UserDocument extends Document { email: string }一样简单
【解决方案2】:

通过在声明架构时添加接口来解决此问题

interface UserInterface extends Document {
  email: string;
}

const User = new Schema<UserInterface>({
  email: String;
})

【讨论】:

    【解决方案3】:

    当我定义我的实体接口时,我让它扩展了“文档”,但没有导入任何东西。

    当我点击它时,虽然我可以看到它错误地认为我指的是内置节点对象“文档”:

    /** Any web page loaded in the browser and serves as an entry point into the web page's content, which is the DOM tree. */
    interface Document extends Node, DocumentAndElementEventHandlers, DocumentOrShadowRoot, GlobalEventHandlers, NonElementParentNode, ParentNode, XPathEvaluatorBase {
    

    在我明确告诉它使用 mongoose 库中的 Document 之后,一切正常。 ?

    import { Document } from 'mongoose';
    

    【讨论】:

      猜你喜欢
      • 2021-02-12
      • 1970-01-01
      • 2021-07-05
      • 2021-05-09
      • 2021-01-07
      • 1970-01-01
      • 2021-09-20
      • 2021-05-29
      • 2019-09-07
      相关资源
      最近更新 更多