【问题标题】:Mongoose: TypeError: Method Uint8Array.length called on incompatible receiverMongoose:TypeError:在不兼容的接收器上调用方法 Uint8Array.length
【发布时间】:2017-01-29 21:55:23
【问题描述】:

我正在使用 i18n 制作一个小型网站。开始时我使用本地 json 文件,但在切换到 mongodb 后,我遇到了一个我不明白的错误。非常感谢一个好的解释。

我得到的错误是这样的:

TypeError:在不兼容的接收器 [object Object] 上调用方法 Uint8Array.length

我用“da”和“en”属性构造 i18n 数据。然后我使用一种过滤相关语言的方法。

这是我的数据示例,包括 json 和相应的 mongoose 结果。两者都是从终端复制的(用console.log打印):

json

[ { lang: { da: 'Dansk', en: 'Danish' }, rating: 5 },
  { lang: { da: 'Engelsk', en: 'English' }, rating: 5 },
  { lang: { da: 'Tysk', en: 'German' }, rating: 5 } ]

猫鼬

[ { _id: 57e2561369e4bc0a8ca6c630,
    lang: { da: 'Dansk', en: 'Danish' },
    rating: 5,
    id: '57e2561369e4bc0a8ca6c630' },
  { _id: 57e2561369e4bc0a8ca6c631,
    lang: { da: 'Engelsk', en: 'English' },
    rating: 5,
    id: '57e2561369e4bc0a8ca6c631' },
  { _id: 57e2561369e4bc0a8ca6c632,
    lang: { da: 'Tysk', en: 'German' },
    rating: 5,
    id: '57e2561369e4bc0a8ca6c632' } ]

filterLanguage 方法

var traverse = require('traverse');
var filterLanguage = function(language, obj) {
    return traverse(obj).map(function (item) {
        if (this.key === language) {
            this.parent.update(item);
        }
    });
};

所以filterLanguage('da', languages); 应该返回如下内容:

[ { lang: 'Dansk', rating: 5 },
  { lang: 'Engelsk', rating: 5 },
  { lang: 'Tysk', rating: 5 } ]

filterLanguage() 适用于本地有效的 JSON 文件,但不适用于 Mongoose 结果集...

我试过JSON.stringify(obj)。我还尝试在 Mongoose 模型中设置 toObject() 方法,但没有成功。

我做错了什么,我该如何解决?

--------- 编辑 ---------

型号

var mongoose = require('mongoose');
var languageSchema = mongoose.Schema({
    local: {
        lang: { da: String, en: String },
        rating: Number
    }
});
module.exports = mongoose.model('Language', languageSchema);

查询

language.find({}, function(err, results) {
    var obj = filterLanguage(lang, results.languages);
    console.log(obj);
});

我尝试在架构上设置toObject,如下所示:

languageSchema.set('toObject', { virtuals: true });

【问题讨论】:

  • 什么是traverse()?你为什么要传递 results.experience 而这似乎不是你架构的一部分?
  • 更新问题:traverse 是一个用于遍历 js 对象的 npm 库。经验是复制/粘贴错误,应该是语言。请注意,这是一个简化的示例,而不是完整的代码。因此更容易获得概览。

标签: json node.js mongodb express mongoose


【解决方案1】:

您收到的错误与 traverse 无法处理您的 results 数组中的 ObjectId 实例有关。

由于您似乎没有使用 _idid,因此解决此问题的最简单方法是从结果文档中排除这些属性:

language.find({}, '-_id -id', function(err, results) { ... })

-id 可能是多余的,因为它是一个依赖于_id 的虚拟)

【讨论】:

  • 谢谢!你知道为什么 traverse 不能处理 ObjectId 吗?它只识别原生 JS 类型还是...?
  • @olefrank 实际上比我最初想象的要复杂一些。当你just 运行filterLanguage() 时,它工作得很好。但是,一旦您想将该函数的结果用于某事(例如console.log),就会发生错误。也许 traverse "breaks" ObjectId 实例(或者更具体地说,使用 traverse(...).map() 会破坏它)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 2020-09-11
  • 2020-07-09
相关资源
最近更新 更多