【问题标题】:Mongoose typescript model creation with multiple connections具有多个连接的 Mongoose 打字稿模型创建
【发布时间】:2021-01-14 02:38:52
【问题描述】:

我正在尝试使用多个连接 (following the docs) 创建模型,但出现以下错误:

TS2345: Argument of type 'Schema<Document<any>, Model<Document<any>>>' is not assignable to parameter of
type 'Schema<UserInterface, UserModelInterface>'.
Types of property 'methods' are incompatible.
... (a bunch of 'is not assignable - is missing the following properties' errors follow) ...

我的代码如下所示:

database.ts

import mongoose from "mongoose";

// const mongo = mongoose.connection(process.env.DB_URI!, {
const mongo = mongoose.createConnection(process.env.DB_URI!, {
    useUnifiedTopology: true,
    useNewUrlParser: true,
    useFindAndModify: false,
    useCreateIndex: true
})

export default mongo

UserModel.ts

import mongoose, {Model} from 'mongoose';
import bcrypt from 'bcrypt'
import database from "../database";

interface UserDocumentInterface extends mongoose.Document {
    firstname: string
    lastname: string
    ...
}
    
interface UserInterface extends UserDocumentInterface {
    // Instance methods
    hashPassword(password: string): Promise<string>
    ...
}
    
export interface UserModelInterface extends Model<UserInterface> {
    // Static methods
    // Currently empty
}

const UserSchema = new mongoose.Schema({
    firstname: {
        type: String,
        required: true,
        trim: true
    },
    lastname: {
        type: String,
        required: true,
        index: true,
        trim: true,
    },
    ...
})

// Methods definitions
UserSchema.methods.hashPassword = async function(password) {
    return await bcrypt.hash(password, 10);
}
...

// const User: UserModelInterface = mongoose.model<UserInterface, UserModelInterface>('User', UserSchema)
const User = database.model<UserInterface, UserModelInterface>('User', UserSchema)
export default User

错误出现在UserSchemaconst User = database.model&lt;UserInterface, UserModelInterface&gt;('User', UserSchema)

我不明白为什么这条线没有问题

const User: UserModelInterface = mongoose.model<UserInterface, UserModelInterface>('User', UserSchema)

但是这个会报错

const User = database.model<UserInterface, UserModelInterface>('User', UserSchema)

当唯一改变的是连接类型时,mongoose.createConnection() 而不是 mongoose 默认连接

【问题讨论】:

  • 我真的不知道上面的问题。但是为了分享我的经验,我尝试在一个大型项目中使用 Mongoose 和类型,这确实很麻烦。它从来没有真正正确地工作过。同样使用底层 MongoDB 也不是一个好的决定(至少对于我们的数据结构而言)。我最近切换到使用 PGSQL 的 Prisma,TypeScript 开发人员体验远远超过我使用 Mongoose 和 NoSQL 所获得的体验。

标签: node.js mongodb typescript mongoose


【解决方案1】:

事实证明,从版本 mongoose 5.11.11 开始,使用 typescript (see this issue) 时与 @types/mongoose 存在一些冲突,这会破坏类继承。 我还在this discussion 中找到了我的问题的解决方案,它围绕将文档和模型接口从模型移动到架构构造函数。

在实践中,这意味着转动这个

const UserSchema = new mongoose.Schema({
    firstname: {
        type: String,
        required: true,
        trim: true
    },
    lastname: {
        type: String,
        required: true,
        index: true,
        trim: true,
    },
    ...
})
    
const User = database.model<UserInterface, UserModelInterface>('User', UserSchema)
export default User

进入这个

const UserSchema = new mongoose.Schema<UserInterface, UserModelInterface>({
    firstname: {                            // INTERFACES GO HERE 
        type: String,
        required: true,
        trim: true
    },
    lastname: {
        type: String,
        required: true,
        index: true,
        trim: true,
    },
    ...
})
                // INSTEAD OF HERE
const User = database.model('User', UserSchema)
export default User

在我看来,这似乎是一个临时修复,该问题可能只会影响 v5.11.11,因为它正在 5.11.12 中进行修补,因此我建议在使用之前访问上面的链接以查看问题状态这个建议。

【讨论】:

    猜你喜欢
    • 2020-10-05
    • 1970-01-01
    • 2021-12-31
    • 2011-01-24
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多