承诺已解决但返回部分数据 - 其余“未定义”

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() 传递了一个承诺,该承诺以非响应值“未定义”解决。浏览器同步

解决一堆承诺时出现 Firebase 错误:无法将未定义或 null 转换为对象

财产在承诺中未定义,但在承诺之外工作