无法使用 Object.keys(doc).forEach 读取未定义的属性



我收到"无法读取未定义的属性'重复'"错误,但在控制台日志记录时,对象似乎已定义良好,所以我不知道为什么代码崩溃。

以下是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=> . . . )结构似乎有问题,因为sec$___而不是authDatanameData等形式出现,我是否可以遍历Object.keys(doc),如果是这样,我做错了什么?

与其过滤特定键,不如先检查该键是否存在于meta中。

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

最新更新