Как проверить, не существует ли имя пользователя, затем вставить значение имени пользователя и продолжить функцию findOneAndUpdate - PullRequest
0 голосов
/ 10 мая 2018

У меня есть эта функция findOneAndUpdate, она найдет, если имя пользователя, если оно существует, тогда установит поле времени и увеличит номер другого поля.

function _lockIfFailedAttemptsReachLimit(username,next) {
    colUser.findOneAndUpdate({ username }, { // increase failed attempt counter
        $set: { failedLoginAt: new Date() },
        $inc: { nFailedLogin: 1 },
    }, { upsert: false, returnOriginal: false }, (err, result) => {
        if (err) { // Undefined.
            next('Undefined error!');
        } else {
            let foundUser = result.value;
            if (_.isNil(foundUser)) { // cannot find username
                //nothing here yet.
            }

            let nFailed = _.get(foundUser, 'nFailedLogin', 0);

            let errMsg = `Invalid username or passsword. You have tried ${nFailed}/${MAX_FAILED_LOGIN_ATTEMPTS} login attempts`;

            if (nFailed < MAX_FAILED_LOGIN_ATTEMPTS) {
                next(errMsg);
            } else {
                _lockAccount(username, (err, result) => {
                    if (!err) {
                        errMsg += `. Your account has been locked for ${WAITING_TIME_AFTER_LOCKED} seconds.`;
                    }
                    next(errMsg);
                });
            }
        }
    });
}

Теперь я хочу в той же функции, если не могу найти имя пользователя, тогда он вставит значение имени пользователя и сделает тот же процесс для этого имени пользователя. Как я могу сделать это в наиболее эффективном кодировании? Я попробовал:

function _lockIfFailedAttemptsReachLimit(username, req, res, next) {
    colUser.findOneAndUpdate({ username }, { // increase failed attempt counter
        $set: { failedLoginAt: new Date() },
        $inc: { nFailedLogin: 1 },
    }, { upsert: false, returnOriginal: false }, (err, result) => {
        if (err) { // Undefined.
            next('Undefined error!');
        } else {
            let foundUser = result.value;
            if (_.isNil(foundUser)) { // cannot find username
                //I think can try to put the code here ?
                let username = (req.headers['x-forwarded-for'] ||
                    req.connection.remoteAddress ||
                    req.socket.remoteAddress ||
                    req.connection.socket.remoteAddress).split(",")[0];
                // insert username to the table and call the function to continue from the beginning
            }

            let nFailed = _.get(foundUser, 'nFailedLogin', 0);

            let errMsg = `Invalid username or passsword. You have tried ${nFailed}/${MAX_FAILED_LOGIN_ATTEMPTS} login attempts`;

            if (nFailed < MAX_FAILED_LOGIN_ATTEMPTS) {
                next(errMsg);
            } else {
                _lockAccount(username, (err, result) => {
                    if (!err) {
                        errMsg += `. Your account has been locked for ${WAITING_TIME_AFTER_LOCKED} seconds.`;
                    }
                    next(errMsg);
                });
            }
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...