0

I have a object, and I need to call a method of it from another method inside the same object. I'm using ES6 syntax:

var user = {
login(name, password) {
        return new Promise(function(resolve, reject) {
            console.log('ready to find');
            var args = {
                'name': 'users',
                'query': {
                    'name': name
                },
                'options': {
                    '_id': 1,
                    'name': 1,
                    'password': 1
                }
            };
            db.find(args).toArray().then(function(result) {
                    var auth = {};
                    if(result[0] && result[0].password == password) {
                        console.log('user ok');
                        auth = {
                            ok: 1,
                            userID: result[0]._id,
                            user: result[0].name
                        };
                    } else {
                        console.log('user wrong');
                        auth = {
                            ok: -1,
                            errmsg: 'password wrong'
                        };
                    }
                    resolve(auth);
                })
                .catch(function(err) {
                    reject(err);
                });
        });
    },
    find(userID) {
        console.log("USER: find");
        return new Promise(function(resolve, reject) {
            var args = {
                'name': 'users',
                'query': {
                    '_id': userID
                },
                'options': {
                    'name': 1
                }
            };
            db.find(args).toArray().then(function(result) {
                    var findResult = {};
                    if(result[0]) {
                        findResult.ok = 1;
                        findResult.user = result[0].name;
                    } else {
                        findResult.ok = -1;
                        findResult.errmsg = 'not found';
                    }
                    return findResult;
                })
                .catch(function(err) {
                    throw err;
                });
        });
    },
    authenticate(session) {
        return new Promise(function(resolve, reject) {
            console.log("USER: authenticate");
            if(session.cookie && session.userID && session.user) {
                var _expires = session.cookie._expires;
                var userID = session.userID;
                var user = session.user;
                if(new Date(_expires) > new Date(Date.now())) {
                    console.log("USER: session isn't expired");
        console.log(userID);
                    user.find(userID);
                }
            }
        });
    },

};

I can call the user.find() outside, but can't call it from the user.anthenticate(). The console.log("USER: session isn't expired"); and console.log(userID); worked well, but the console.log("USER: find"); didn't

Felix Kling
  • 795,719
  • 175
  • 1,089
  • 1,143
Brick Yang
  • 5,388
  • 8
  • 34
  • 45

1 Answers1

0

Your statement

var user = session.user;

introduces a second user variable that shadows the one with the find method. Just omit it, you don't need it.

var user = {
    login(name, password) {
        console.log('ready to find');
        return db.find({
            'name': 'users',
            'query': {'name': name},
            'options': {'_id': 1, 'name': 1, 'password': 1}
        }).toArray().then(function(result) {
            var auth = {};
            if(result[0] && result[0].password == password) {
                console.log('user ok');
                return {ok: 1, userID: result[0]._id, user: result[0].name};
            } else {
                console.log('user wrong');
                return {ok: -1, errmsg: 'password wrong'};
            }
        });
    },
    find(userID) {
        console.log("USER: find");
        db.find({
            'name': 'users',
            'query': {'_id': userID},
            'options': {'name': 1}
        }).toArray().then(function(result) {
            var findResult = {};
            if(result[0]) {
                return {ok: 1, user: result[0].name};
            } else {
                return {ok: -1, errmsg: 'not found'};
            }
        });
    },
    authenticate(session) {
        console.log("USER: authenticate");
        if(session.cookie && session.userID && session.user) {
            var _expires = session.cookie._expires;
            var userID = session.userID;
            if(new Date(_expires) > new Date(Date.now())) {
                console.log("USER: session isn't expired");
                console.log(userID);
                return user.find(userID);
            }
        }
    });
}
Bergi
  • 630,263
  • 148
  • 957
  • 1,375