@last_round

Как правильно вернуть функцию?

Сервер на NodeJS принимает post запрос:
router.post('/register', urlencodedParser, function(req, res) {
    var regUser, resp;
    regUser = new User();
    resp = regUser.register(req.body);
    console.log(resp);
    return res.send(req.body);
});

Так же у меня есть функция-конструктор User, которая имеет метод register
(Когда приходит пост запрос регистрируем пользователя), вот код:
User = (function() {
    function User() {}

    User.prototype.register = function(obj) {
      var codeFunc, newUser;
      codeFunc = 0;
      newUser = new userSchema({
        login: obj.login,
        password: obj.pass,
        email: obj.mail
      });
      userSchema.find({
        login: obj.login
      }, function(err, docs) {
        if (err) {
          throw err;
        }
        if (typeof docs[0] === 'object') {
          return console.log('Login already is used', codeFunc = 401);
        } else {
          return newUser.save((function(_this) {
            return function(err) {
              if (err) {
                throw err;
              } else {
                codeFunc = 201;
              }
              return console.log(codeFunc = 201);
            };
          })(this));
        }
      });
      return codeFunc;
    };

    return User;

  })();

Метод register выполняем поиск по базе данных пользователя с таким же именем что и было передано в функцию и если есть совпадение, то присваиваю переменной codeFunc = 401 (значит логин занят) и тд.
Проблема: функция register должна вернуть код (401 или 201), но сначала отрабатывает console.log(resp); (который в начале я написал), а после него уже console.log(codeFunc = 201); (который отрабатывает если успешно зарегистрирован пользователь). И получается что на выходе функции register я имею 0 (codeFunc = 0, я сам его объявляю),а не код операции.
5ac0ab4bbf182736491863.png
  • Вопрос задан
  • 243 просмотра
Решения вопроса 1
megafax
@megafax
web-программист
У Вас асинхронно выполняется поиск, а синхронно отрабатывает последний return. Заверните функцию в промис или используйте async/await.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы