承诺已解决但返回部分数据 - 其余“未定义”
Posted
技术标签:
【中文标题】承诺已解决但返回部分数据 - 其余“未定义”【英文标题】:Promise resolved but returns part of data - rest 'undefined' 【发布时间】:2017-10-10 05:00:30 【问题描述】:我遇到了从 MongoDB 的 mLab 返回的 Promise 的问题。部分数据正确传递,其余未定义。我不确定这里发生了什么。
这是我连接到的 mLab 集合中的 JSON 对象。
"_id":
"$oid": "591424da932aad14186a7213"
,
"name": "Archos Elements 50 Oxygen",
"weight_oz": 4.59,
"battery_capacity_mAh": 2300,
"platform": "android",
"date":
"$date": "2017-05-11T08:46:18.684Z"
,
"dimensions":
"width_mm": 70.5,
"height_mm": 143,
"depth_mm": 9.9
,
"__v": 0
这就是我检索数据的方式(body-parser 用于捕获用户通过 html 表单输入的手机的“名称”)
router.post('/page_2', function(req, res)
phone = req.body.phone
mobile_and_tablet_model.find(name:phone).exec(function(err, result)
if (err)
throw err;
).then(function(MongoDBdata)
console.log(MongoDBdata[0]) // logs out entire JSON object correctly
console.log(MongoDBdata[0]._id) // 5002
console.log(MongoDBdata[0].name) // Archos Elements 50 Oxygen
console.log(MongoDBdata[0].weight_oz) // undefined
console.log(MongoDBdata[0].battery_capacity_mAh) // undefined
console.log(MongoDBdata[0].platform) // Android
console.log(MongoDBdata[0].date) // 2017-05-11T08:06:27.894Z
console.log(MongoDBdata[0].dimensions) // undefined
res.render('page_2.hbs',
title: 'some title',
phone: phone,
battery_capacity: MongoDBdata[0].battery_capacity_mAh, // undefined
platform: MongoDBdata[0].platform // Android
)
)
)
有人可以帮助我理解这种行为并帮助我解决它吗?
我不明白为什么 JSON 对象上的某些嵌套值会出现“未定义”。我远不是 Promises 方面的专家,但如果我理解正确,那么 Promise 已经解决,所以同步/异步行为不应该在这里发挥作用吗? (特别是因为 console.log(MongoDBdata[0]) 完全注销了 JSON 内容)。
非常感谢!
【问题讨论】:
你为什么同时使用exec()
中的回调和只使用其中一个的承诺? exec()
返回一个承诺,以便您可以使用 .catch(function(error) //do whaterver you want with this error );
处理错误
感谢@mJehanno 的评论。我相应地调整了代码。完全有道理。不幸的是,问题仍然存在。
【参考方案1】:
终于明白了。
我没有调整的架构有问题(一个架构用于将数据上传到 MongoDB,另一个用于检索 - 我更改了一个用于上传,但没有更改另一个用于下载)
这就是某些数据可能返回“未定义”的原因(即使从集合中检索到的 JSON 已 100% 正确注销)。当我尝试访问对象上的嵌套值时,我实际上使用了不正确的猫鼬模型。
下面的架构有效(所有返回“未定义”的值现在都返回正确的值)。希望有人能从我的错误中受益。
【讨论】:
以上是关于承诺已解决但返回部分数据 - 其余“未定义”的主要内容,如果未能解决你的问题,请参考以下文章
未捕获(承诺):TypeError:无法读取未定义的属性“创建”(离子 3.9,Angularjs 5.0.3)
ServiceWorker 向 FetchEvent.respondWith() 传递了一个承诺,该承诺以非响应值“未定义”解决。浏览器同步