使用TypeScript时Mongoosastic search函数提示undefined问题求助
解决mongoose + mongoosastic + TypeScript中
PageModel.search为undefined的问题 问题原因分析
你的代码主要存在两个核心问题:
- 类型断言错误:错误地将
MongoosasticModel作为mongoose.Model的第二个泛型参数(该参数应为QueryHelpers类型),导致TypeScript无法正确识别插件添加的静态方法。 - 模型复用隐患:如果
mongoose.models.page已存在,说明该模型可能是在未应用mongoosastic插件的情况下创建的,此时复用模型会直接导致插件方法缺失。
解决方案
1. 修正类型断言方式
将模型的类型断言改为mongoose.Model<IPage> & MongoosasticModel<IPage>,让TypeScript正确合并mongoose原生模型类型与mongoosastic的扩展类型。
2. 确保插件先于模型创建应用
保证Schema先添加插件,再处理模型创建逻辑;对于已存在的模型,直接断言其包含mongoosastic的方法(前提是你能确认该模型创建时已应用插件)。
修改后的完整代码
import mongoose, { Schema, Document } from 'mongoose'; import mongoosastic, { MongoosasticModel, MongoosasticDocument } from 'mongoosastic' export interface IPage extends Document, MongoosasticDocument { user: string; permissions: { [key: string]: { read: boolean; write: boolean; admin: boolean; email: string; }; }; style: Record<string, any>; // 用Record替代空对象类型,类型更规范 data: { blockType: string; properties: Record<string, any>; children: any[]; // 明确数组类型,避免隐式any问题 }[]; } const PageSchema = new Schema({ user: String, permissions: Schema.Types.Mixed, // 用Schema.Types.Mixed替代空对象,符合mongoose规范 style: Schema.Types.Mixed, data: [ { blockType: String, properties: Schema.Types.Mixed, children: [], }, ], }); // -=- Elastic Search -=- if (!process.env.ELASTICSEARCH_URL) throw Error('Missing Elastic Search URL'); // 先添加插件,再处理模型创建 PageSchema.plugin( mongoosastic, { clientOptions: { nodes: [process.env.ELASTICSEARCH_URL], }, transform: (doc: IPage) => { // 返回需要同步到ES的文档结构 return { user: doc.user, // 按需添加其他需要索引的字段 }; }, } ); // 修正类型断言:合并mongoose Model和MongoosasticModel类型 const PageModel = (mongoose.models.page as (mongoose.Model<IPage> & MongoosasticModel<IPage>) || mongoose.model<IPage>('page', PageSchema)) as mongoose.Model<IPage> & MongoosasticModel<IPage>; // 此时PageModel.search可被正确识别和调用 export default PageModel;
额外排查点
- 兼容性检查:若问题仍存在,可尝试降级mongoose到v5.x版本,或升级mongoosastic至最新版,确认二者版本适配性。
- ES连接监听:添加错误监听排查插件初始化是否失败:
PageModel.on('es:error', (err) => { console.error('Mongoosastic ES连接错误:', err); });
内容的提问来源于stack exchange,提问作者Eroxl
相关产品推荐
相关产品推荐

