Невозможно прочитать свойство undefined с Object.keys (doc) .forEach - PullRequest
0 голосов
/ 08 октября 2019

Я получаю сообщение об ошибке «не могу прочитать свойство« повторы »из неопределенного», но после входа в консоль кажется, что объект (-ы) четко определен, поэтому я не знаю, почему происходит сбой кода.

Вот журнал консоли 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 выходит как $___ вместо authData, nameData и т. Д. Могу ли я выполнить итерацию поObject.keys(doc) и если да, то что я делаю не так?

1 Ответ

1 голос
/ 08 октября 2019

Вместо того, чтобы фильтровать определенные ключи, просто проверьте, существует ли ключ в meta сначала.

Object.keys(doc).forEach(sec => {
    if (meta.hasOwnProperty(sec) && meta[sec].repeats) {
        ...
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...