Mongoosastic: TypeError: Cannot read property 'toLowerCase' of undefined

Mongoosastic: TypeError: Cannot read property 'toLowerCase' of undefined

在使用 Mongoosastic 同步模型时我收到此错误:

TypeError: Cannot read property 'toLowerCase' of undefined at setIndexNameIfUnset (/app/node_modules/mongoosastic/lib/mongoosastic.js:239:29) at EmbeddedDocument.schemaIndex [as index] (/app/node_modules/mongoosastic/lib/mongoosastic.js:385:5) at EmbeddedDocument.postSave (/app/node_modules/mongoosastic/lib/mongoosastic.js:269:14) at next (/app/node_modules/kareem/index.js:198:31) at Kareem.execPost (/app/node_modules/kareem/index.js:217:3) at /app/node_modules/mongoose/lib/plugins/saveSubdocs.js:54:29 at each (/app/node_modules/mongoose/lib/helpers/each.js:11:5) at model. (/app/node_modules/mongoose/lib/plugins/saveSubdocs.js:53:5) at callMiddlewareFunction (/app/node_modules/kareem/index.js:482:23) at next (/app/node_modules/kareem/index.js:193:9) at next (/app/node_modules/kareem/index.js:212:9) at Kareem.execPost (/app/node_modules/kareem/index.js:217:3) at _cb (/app/node_modules/kareem/index.js:307:15) at /app/node_modules/mongoose/lib/model.js:400:5 at /app/node_modules/mongoose/lib/model.js:324:11 at runMicrotasks ()

1.) orderLineItem 架构:

let orderLineItemSchema = new mongodb.Schema({
    orderId: { type: String, es_indexed: true },
    name: { type: String, es_indexed: true },
    description: { type: String, es_indexed: true },
    privateNotice: { type: String, es_indexed: true },
    netPrice: { type: String, default: 0, es_indexed: true },
    taxPercent: { type: Number, default: 23, es_indexed: true },
    projectFile: { type: projectFileSchema, es_schema: projectFileSchema, es_indexed: true, es_type: 'nested', es_include_in_parent: true },
    component: { type: [componentSchema], es_indexed: true, es_type: 'nested', es_include_in_parent: true },
    additionalFiles: { type: [projectFileSchema], es_indexed: true, es_type: 'nested', es_include_in_parent: true },
    status: { type: orderLineItemStatusSchema, es_indexed: true },
    accepted: { type: Boolean, default: false, es_indexed: true },
    archived: { type: Boolean, default: false, es_indexed: true }
}, {
    timestamps: true
});

2.) projectFileSchema:

let projectFileSchema = new mongodb.Schema({
    name: { type: String, es_indexed: true },
    mimeType: { type: String, es_indexed: true },
    path: { type: String, es_indexed: true },
    archived: { type: Boolean, default: false, es_indexed: true }
});

3.) 组件模式:

let componentSchema = new mongodb.Schema({
    name: { type: String, es_indexed: true },
    category: { type: String, es_indexed: true },
    componentId: { type: String, es_indexed: true },
    symbol: { type: String, es_indexed: true },
    archived: { type: Boolean, default: false, es_indexed: true }
});

4.) orderLineItemStatusSchema:

let orderLineItemStatusSchema = new mongodb.Schema({
    name: {
        type: String,
        default: 'Utworzony'
    }
}, {
    timestamps: true
});

5.) 我的同步码:

const synchronize = (model) => {
    let stream = model.synchronize();

    stream.on('data', function(err, doc){
      // Logging success to the console
    });
    stream.on('close', function(){
      // Logging ...
    });
    stream.on('error', function(err){
        console.log(err);
    });
}

module.exports = synchronize;

6.) 下面是我的使用方法:

const mongodb = require('mongoose');
const mtastic = require('mongoosastic');
const esClient = require('../dependencies/elasticsearch');
const orderLineItemSchema = require('../schemas/OrderLineItem/OrderLineItem');
const synchronizer = require('../helpers/synchronizer'); // This is the synchronization function

orderLineItemSchema.plugin(mtastic, {
    esClient: esClient
});

let OrderLineItem = mongodb.model('OrderLineItem', orderLineItemSchema);

let interval = setInterval(() => {
    synchronizer(OrderLineItem);
}, 10000);

module.exports = OrderLineItem;

这与我在我的应用程序中同步其他模型的方式完全相同,但只有这个 returns 那个错误。

我该如何解决这个问题?

目前还不清楚 from the source code 为什么 modelName 会是 undefined...

无论如何,每个 mongoosastic 模型构造函数 accepts an index parameter 所以我会在注册插件时声明它:

...
orderLineItemSchema.plugin(mtastic, {
    esClient: esClient,
    index: 'orders-index`     // <---
});

let OrderLineItem = mongodb.model('OrderLineItem', orderLineItemSchema);
...

在mongoosastic仓库中有two issues个没有解决方案的关闭,提示这很可能是库中的一个错误,可能在用户代码中没有解决方案。

这些问题和你的共同点是子文档的使用,快速浏览一下库的源代码表明它可能确实与该案例的不当处理有关。

查看库的测试套件也没有显示任何涵盖这种情况的测试,进一步表明它可能根本不受支持。