Nic*_*las 7 javascript mongoose node.js typescript next.js
我正在使用 TypeScript 和 MongoDB/Mongoose 构建 Next.js 应用程序。我在使用 Mongoose 模型时开始遇到错误,这导致它们在每次使用模型时都尝试覆盖模型。
导致模型覆盖错误的代码:
import mongoose from 'mongoose';
const { Schema } = mongoose;
const categorySchema = new Schema({
name: {type: String, required: true},
color: {type: String, required: true}
})
export default mongoose.model('Category', categorySchema, 'categories')
Run Code Online (Sandbox Code Playgroud)
我发现在许多使用 Next.js 和 Mongoose 的项目中,包括 Next.js 的示例项目,他们在导出时使用以下语法来解决这个问题:
export default mongoose.models.Category || mongoose.model('Category', categorySchema, 'categories')
Run Code Online (Sandbox Code Playgroud)
这感觉很奇怪,有点像“创可贴解决方案”,但乍一看似乎很有效;如果模型已经存在,它可以防止覆盖。然而,使用 TypeScript 我开始遇到另一个问题,过了一段时间我发现这个问题是由那一行引起的。由于导出非常繁琐,TypeScript 无法解析类别模型,并且每当我尝试使用它的大部分属性或方法时都会抛出错误。我更深入地研究了它,发现其他一些人通过这样做来解决这个问题:
import mongoose from 'mongoose';
const { Schema } = mongoose;
const categorySchema = new Schema({
name: {type: String, required: true},
color: {type: String, required: true}
})
interface CategoryFields {
name: string,
color: string
}
type CategoryDocument = mongoose.Document & CategoryFields
export default (mongoose.models.Category as mongoose.Model<CategoryDocument>) || mongoose.model('Category', categorySchema, 'categories')
Run Code Online (Sandbox Code Playgroud)
再说一遍,这似乎能达到目的,但它只是欺骗 TypeScript 让它相信没有什么奇怪的事情发生,而实际上确实有。
是否没有真正的解决方案可以解决模型覆盖问题,而无需跳过障碍并用其他错误覆盖错误?
提前致谢!
export interface CategoryDoc extends Document {
name:string,
color:string
}
export interface CategoryModel extends Model<CategoryDoc> {}
Run Code Online (Sandbox Code Playgroud)
然后像这样导出
// you might remove the 'categories'
export default mongoose.models.Category || mongoose.model<CategoryDoc,CategoryModel>('Category', categorySchema, 'categories')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1895 次 |
| 最近记录: |