【问题标题】:Mongoosastic: TypeError: Cannot read property 'toLowerCase' of undefinedMongoosastic:TypeError:无法读取未定义的属性“toLowerCase”
【发布时间】:2021-05-26 18:42:49
【问题描述】:

在将模型与 Mongoosastic 同步时,我收到此错误:

TypeError:无法读取未定义的属性“toLowerCase” setIndexNameIfUnset (/app/node_modules/mongoosastic/lib/mongoosastic.js:239:29)在 EmbeddedDocument.schemaIndex [作为索引] (/app/node_modules/mongoosastic/lib/mongoosastic.js:385:5) 在 EmbeddedDocument.postSave (/app/node_modules/mongoosastic/lib/mongoosastic.js:269:14) 在下一个 (/app/node_modules/kareem/index.js:198:31) 在 Kareem.execPost (/app/node_modules/kareem/index.js:217:3) 在 /app/node_modules/mongoose/lib/plugins/saveSubdocs.js:54:29 在每个 (/app/node_modules/mongoose/lib/helpers/each.js:11:5) 在 模型。 (/app/node_modules/mongoose/lib/plugins/saveSubdocs.js:53:5) 在 callMiddlewareFunction (/app/node_modules/kareem/index.js:482:23) 在 下一个 (/app/node_modules/kareem/index.js:193:9) 在下一个 (/app/node_modules/kareem/index.js:212:9) 在 Kareem.execPost (/app/node_modules/kareem/index.js:217:3) 在 _cb (/app/node_modules/kareem/index.js:307:15) 在 /app/node_modules/mongoose/lib/model.js:400:5 在 /app/node_modules/mongoose/lib/model.js:324:11 在 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;

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

我该如何解决这个问题?

【问题讨论】:

  • 你能得到一个“更完整”的堆栈跟踪吗?
  • @JoeSorocin 遗憾的是,我现在没有完整的堆栈跟踪,因为在我从 MongoDB 中删除所有内容然后重新启动所有内容之后,此错误停止发生。这显然不是解决方案,我只是需要应用程序正常工作以进行演示。
  • 我听到了,但我们需要更多细节来调试它。
  • @JoeSorocin 我设法得到了同样的错误。现在我用 Node 给我的完整堆栈跟踪编辑了这个问题。
  • 能否请您展示一下orderLineItemSchema 的样子?

标签: node.js mongodb express elasticsearch mongoosastic


【解决方案1】:

在 mongoosastic 存储库中有 two issues 在没有解决方案的情况下关闭,这表明这很可能是库中的错误,可能在用户代码中没有解决方案。

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

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

【讨论】:

  • 这很可能是我在这个问题上得到的最佳答案。很长一段时间以来,我一直在寻找一种方法来解决这个错误,但我愿意相信这可能是一个库问题。非常感谢您研究已关闭的问题。
【解决方案2】:

目前还不清楚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);
...

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 2020-07-23
    • 2020-06-24
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2018-08-07
    相关资源
    最近更新 更多