“文档”类型上不存在猫鼬属性“x”
Posted
技术标签:
【中文标题】“文档”类型上不存在猫鼬属性“x”【英文标题】:Mongoose Property 'x' does not exist on type 'Document' 【发布时间】: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
【参考方案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';
【讨论】:
以上是关于“文档”类型上不存在猫鼬属性“x”的主要内容,如果未能解决你的问题,请参考以下文章