Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 无法访问populate()和#x27;猫鼬身上有什么东西?_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 无法访问populate()和#x27;猫鼬身上有什么东西?

Node.js 无法访问populate()和#x27;猫鼬身上有什么东西?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,这很奇怪。。。我使用带有ref的populate()来填充模式中的数组,但是属性是不可访问的。换句话说,模式如下所示: new Model('User',{ 'name': String, 'installations': [ {type: String, ref: 'Installations'} ], 'count': Number, } { runs: 49, hardware: 'macbookpro10,1/x86_64', mode: 'debug', ve

这很奇怪。。。我使用带有ref的populate()来填充模式中的数组,但是属性是不可访问的。换句话说,模式如下所示:

new Model('User',{
    'name': String,
    'installations': [ {type: String, ref: 'Installations'} ],
    'count': Number,
}
{ runs: 49,
hardware: 'macbookpro10,1/x86_64',
mode: 'debug',
version: '0.1' }
 Object.keys(user.installations[i]).forEach(function(key) { } );
当然,安装是另一种模式

然后我找到并填充一组用户

model.find({count: 0}).populate('installations').exec( function(e, d){
    for(var k in d)
    { 
        var user = d[k];
        for(var i in user.installations)
        {
            console.log(user.installations[i]);
        }
    }
} );
到目前为止还不错!我看到打印出来的数据很好,如下所示:

new Model('User',{
    'name': String,
    'installations': [ {type: String, ref: 'Installations'} ],
    'count': Number,
}
{ runs: 49,
hardware: 'macbookpro10,1/x86_64',
mode: 'debug',
version: '0.1' }
 Object.keys(user.installations[i]).forEach(function(key) { } );
然而,如果我试图实际访问这些属性中的任何一个,它们都是未定义的!例如,如果我添加另一个控制台日志:

console.log(user.installations[i].mode);
然后我看到这个日志打印了“未定义”。 如果我尝试对对象进行操作,如下所示:

new Model('User',{
    'name': String,
    'installations': [ {type: String, ref: 'Installations'} ],
    'count': Number,
}
{ runs: 49,
hardware: 'macbookpro10,1/x86_64',
mode: 'debug',
version: '0.1' }
 Object.keys(user.installations[i]).forEach(function(key) { } );
然后我得到一个典型的“[TypeError:Object.keys在非对象上调用]”错误,表明user.installations[I]不是一个对象(即使它被输出到控制台,就像它是一个对象一样)。所以,我甚至尝试了一些丑陋的东西,比如

var install = JSON.parse(JSON.stringify(user.installations[i]));
console.log(install, install.mode);
同样,第一个输出(install)是一个很好的对象,包含属性“mode”。。。但第二个输出未定义


有什么好处

最后,我解决了这个问题

我试着做一个console.log(type of user.installations[I]);并将“string”作为输出。这似乎有些奇怪,因为打印对象直接创建了控制台输出(如上所示),看起来像普通对象,而不是字符串。所以,我试着做了一个JSON.parse();在对象上,但收到错误“SyntaxError:意外令牌r”

最后,我意识到发生了什么。我上面描述的“pretty console输出”是使用\n(换行符)格式化的字符串的结果。不管出于什么原因,我都没料到会这样。出现JSON.parse()错误的原因是,在尝试解析不带引号的对象键时,node.js解析器存在已知的必要性;请参见此处的SO问题: .

具体地说,请注意,在我的例子中,JSON解析器在字符“r”上出现了故障,“runs”的第一个字符是我的JSON字符串中的第一个键(见上文)。起初我担心我需要一个定制的JSON解析器,但后来我遇到了这个问题

回顾我的原始模式。我使用字符串类型来定义安装引用,因为数组字段将安装的_id属性存储为字符串。我假设.populate()字段在输出时将对象转换为字符串


最后,我更仔细地查看了Mongoose文档,并意识到我应该引用基于Schema.ObjectID的对象。这解释了一切,但肯定给了我一些在我的模式和其他地方的代码中要做的修复…

此外,当您使用{strict:false}即无模式体系结构时,也可以使用.toJSON()将其转换为object,并在使用{strict:false}即无模式体系结构时提供帮助。如果我记录填充的数据,我会看到预期看到的结果。但如果我尝试使用点访问某些字段,它会抛出错误“xxxx不存在于'string'类型上”。在差不多几年之后,您的解释仍然有效。