【问题标题】:Cannot read property of undefined with Object.keys(doc).forEach无法使用 Object.keys(doc).forEach 读取未定义的属性
【发布时间】:2020-02-05 07:10:35
【问题描述】:

我收到“无法读取未定义的属性‘重复’”错误,但在控制台日志记录中,似乎对象已明确定义,因此我不知道代码为什么会崩溃。

这是doc对象的控制台日志:

RESULT DOC: { _id: 5d9bc5c2bbb87318847cef91,
  authData:
   { dateEffective: { attr: [Object], value: [] },
     username: { attr: [Object], value: [Array] },
     password: { attr: [Object], value: [Array] },
     mainEmail: { attr: [Object], value: [Array] },
     _id: 5d9bc5c2bbb87318847cef86 },
  nameData:
   { title: { attr: [Object], value: [Array], enum: [Array] },
     firstName: { attr: [Object], value: [Array] },
     middleName: { attr: [Object], value: [Array] },
     familyName: { attr: [Object], value: [Array] },
     suffix: { attr: [Object], value: [Array], enum: [Array] },
     _id: 5d9bc5c2bbb87318847cef87 }
. . .
. . .

这是meta的控制台日志:

META: { authData:
   { label: 'Authentication',
     depth: 4,
     hidden: false,
     repeats: false },
  nameData: { label: 'Name', depth: 5, hidden: false, repeats: false },
. . . 
. . . 
}

users_controller.js - 有问题的路线。 . .

    exports.user_details_post = [(req, res, next)=> {
        //LOG
        console.log(`Request: ${util.inspect(req.body)}`); // <-- ALL GOOD HERE
        next();
        },
        //VALIDATE
        body('email', 'Must be valid email.').isLength({min: 5}).trim(),
        //SANITIZE
        sanitizeBody('*').escape(),
        //SAVE
        (req,res, next) =>{
            let user = UserObj.findById(req.params.id, function(err,doc){
                const errors = validationResult(req);
                let activeArr = [];
                let maxActive = 0;

                if (err) {}
                console.log(`RESULT DOC: ${util.inspect(doc)}`); // <-- ALL GOOD HERE. DOC APPEARS WELL-FORMED
                Object.keys(doc).filter(sec=>sec!=="_id" && sec!=="__v").forEach(sec=>{
                    console.log(`SEC: ${util.inspect(sec)}`); // <-- PROBLEM HERE! 
                                                              // "Sec" is "$___", but should be 
                                                              // "authData", "nameData", etc. 
                                                              // Note, I also tried 
                                                              // "Object.keys(JSON.parse(doc)).filter.  
                                                              // but that didn't work either
                    if (!!meta[sec].repeats) {                // CRASHES HERE. "Meta" is well-defined,                                      
                                                              // and has fields "authData", "emailData",
                                                              // etc., but "sec" seems to be problematic
                        Object.keys(sec).forEach(fld=> {

. . . 
. . .
                }
            })
    }];

显然,Object.keys(doc).forEach(sec=&gt; . . . ) 构造似乎有问题,因为 sec$___ 而不是 authDatanameData 等出现。我是否允许遍历 Object.keys(doc),如果是这样我做错了什么?

【问题讨论】:

  • 遍历Object.keys是允许且正常的。
  • 好的。非常感谢。至少我知道我离基地不远。如果知道Object.keys 的输出为什么没有按预期工作,我将非常感激。
  • 您的问题中有...,这些属性不能在那里吗?

标签: javascript express


【解决方案1】:

与其过滤特定的key,不如先检查meta中是否存在key。

Object.keys(doc).forEach(sec => {
    if (meta.hasOwnProperty(sec) && meta[sec].repeats) {
        ...
    }
});

【讨论】:

  • 非常感谢!这样做!事实证明,findById 返回的对象中添加了许多额外的“隐藏”字段/部分,这些都让我感到困惑。这些“隐藏”字段包括:$_isNewerrors_doc$locals$init。非常感谢!
猜你喜欢
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
相关资源
最近更新 更多