Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot read property 'Symbol(Symbol.iterator)' of undefined

I'm trying to loop through an array to check if it contains any item that passes a specified function. I do this by adding a .any() prototype to the Array object:

Array.prototype.any = (comparator) => {
    for(let item of this){
        if(comparator(item)){
            return true;
        }
    }
    return false;
};

Then calling Array.any() like:

else if(users && users.any((user) => user.userName === user.userName)){
        res.status(400).send('Username already in use');
}

This however gives me the following error:

TypeError: Cannot read property 'Symbol(Symbol.iterator)' of undefined
at Array.any (C:\dev\nodejs\testproject\dist\routes\userRoutes.js:29:39)
at C:\dev\nodejs\testproject\dist\routes\userRoutes.js:87:56
at Query.<anonymous> (C:\dev\nodejs\testproject\node_modules\mongoose\lib\model.js:3748:16)
at C:\dev\nodejs\testproject\node_modules\kareem\index.js:277:21
at C:\dev\nodejs\testproject\node_modules\kareem\index.js:131:16
at _combinedTickCallback (internal/process/next_tick.js:67:7)
at process._tickCallback (internal/process/next_tick.js:98:9)

The error seems to me like it is suggesting 'this' in the prototype function is undefined, but 'this' is the users array for which i checked for undefined.

Not realy sure what is actually causing the issue, hope you can help.

like image 986
Ids van der Zee Avatar asked Jun 02 '17 12:06

Ids van der Zee


2 Answers

The only answer here is that you didn't use "function", so your "this" is not your "users". This would work:

Array.prototype.any = function(comparator) {
    for(let item of this){
        if(comparator(item)){
            return true;
        }
    }
    return false;
};

And then, of course, just use "some".

like image 85
Shl Avatar answered Nov 19 '22 21:11

Shl


Using Array.prototype.any() was unnecesary as I was using mongoose to get the users so I changed it to have mongoose try to get a single user that has the secified username and checking if that was defined. Like:

const checkUniqueUserName = (user, res, done) => {
    User.findOne({"userName": user.userName}, (err, foundUser) => {
        if(err){
            res.sendStatus(500);
            console.log(err);
        }

        else if(foundUser){
            res.status(400).send('Username already in use');
        }

        else{
            done(user);
        }
    });
};
like image 31
Ids van der Zee Avatar answered Nov 19 '22 20:11

Ids van der Zee