Mongoose:TypeError:在不兼容的接收器上调用方法Uint8Array.length

时间:2016-09-21 14:59:29

标签: json node.js mongodb express mongoose

我正在用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 });

1 个答案:

答案 0 :(得分:1)

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

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

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

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

相关问题