我在Node.js中有以下代码。
var getQuestionsByUserId = function (config) {
var query = {
_id: ObjectId(String(config.userId))
};
var projection = {
categoryIds: true,
_id: false
};
var respondWithCategories = function (error, docs) {
var categoryIdsList = []; // empty array
if (docs.length > 0) {
console.log("Inside if: ", docs[0]); // as expected
categoryIdsList = docs[0].categoryIds; // becomes undefined !! the mystery statement
}
console.log("Outside if: ", docs, categoryIdsList); // as expected considering above steps
};
UserModel.find(query, projection, respondWithCategories);
};
输出如下
Inside if: { categoryIds: [ 5731892996a8d72df29d8554, 572f9eb779c548660331071b ] }
Outside if: [ { categoryIds: [ 5731892996a8d72df29d8554, 572f9eb779c548660331071b ] } ] undefined
我使用Mongodb和Mongoose进行访问。
Mongodb版本:v3.2.1
Node.js版本:v5.5.0
问题很简单。如何从对象中获取categoryIds
。
docs
是一个包含单个对象的数组。
categoryIds
是对象中唯一具有数组值的字段。
所以我通过docs[0].categoryIds
访问了。我得到了undefined
!
我在这里缺少什么?
我在浏览器js控制台上尝试过,它运行正常!
编辑:(捍卫此问题的唯一性)
这个标记为重复的问题与异步性质或回调无关,即使我已经提到了mongodb find方法的回调。
这个问题与数组中对象的神秘性质(我觉得我遗漏了一些东西)或ObjectId干扰数组或某种方式来解析JSON对象而不改变返回的ObjectId
字段mongodb。
所以,请删除此问题的重复标记,并让其他人在这里帮助我。
答案 0 :(得分:1)
感谢@JhonnyHK。他的评论帮助我解决了这个问题。
原来,UserModel架构中出现了一个粗心的错误,拼写错误。但好学习。
基本上,这里意味着该字段未在架构中定义。
因此,只要模式中缺少字段,即使对象看起来很好,访问它也会在node.js代码中产生undefined
。
<强>解决方案:强> 更正模式,定义模式中正确访问的字段。在这种情况下,应该更正UserModel架构。
提示强>
如果从JavaScript的角度看一切都是正确的,并且你从mongodb find method的回调参数访问对象时有一个神秘的undefined
,请检查你的模式。