Асинхронная функция, возвращающая неопределенные вместо данных - PullRequest
1 голос
/ 04 мая 2019

Я делаю запросы на мой сервер API для аутентификации пользователя, это не проблема. Проблема в том, что я не знаю, почему моя асинхронная функция ничего не возвращает, и я получаю сообщение об ошибке, потому что данные, которые я хочу получить от этой функции, не определены.

Не волнуйтесь, если управление ошибками уродливо, и в целом я могу сделать это лучше, я сделаю это после исправления этой проблемы.

Utils.js класс

    async Auth(username, password) {

        const body = {
            username: username,
            password: password
        };

        let req_uuid = '';

        await this.setupUUID()
            .then((uuid) => {
                req_uuid = uuid;
            })
            .catch((e) => {
                console.error(e);
            });

        let jwtData = {
            "req_uuid": req_uuid,
            "origin": "launcher",
            "scope": "ec_auth"
        };

        console.log(req_uuid);

        let jwtToken = jwt.sign(jwtData, 'lulz');

        await fetch('http://api.myapi.cc/authenticate', {
            method: 'POST',
            headers: { "Content-Type": "application/json", "identify": jwtToken },
            body: JSON.stringify(body),
        })
            .then((res) => {
                // console.log(res);
                // If the status is OK (200) get the json data of the response containing the token and return it
                if (res.status == 200) {
                    res.json()
                        .then((data) => {
                            return Promise.resolve(data);
                        });
                    // If the response status is 401 return an error containing the error code and message
                } else if (res.status == 401) {
                    res.json()
                    .then((data) => {
                        console.log(data.message);
                    });
                    throw ({ code: 401, msg: 'Wrong username or password' });
                    // If the response status is 400 (Bad Request) display unknown error message (this sould never happen)
                } else if (res.status == 400) {
                    throw ({ code: 400, msg: 'Unknown error, contact support for help. \nError code: 400' });
                }
            })
            // If there's an error with the fetch request itself then display a dialog box with the error message
            .catch((error) => {
                // If it's a "normal" error, so it has a code, don't put inside a new error object
                if(error.code) {
                    return Promise.reject(error);
                } else {
                    return Promise.reject({ code: 'critical', msg: error });
                }
            });
    }

Файл Main.js

utils.Auth('user123', 'admin')
    .then((res) => {
        console.log(res); // undefined
    });

Ответы [ 3 ]

2 голосов
/ 04 мая 2019

Ваша асинхронная функция должна вернуть последнее обещание:

return fetch('http://api.myapi.cc/authenticate', ...);

или дождаться результата и вернуть его:

var x = await fetch('http://api.myapi.cc/authenticate', ...);
// do something with x and...
return x;

Обратите внимание, что вам не нужно смешивать синтаксис обещания (потом) с нетерпением жду.Вы можете, но вам не нужно, и, вероятно, не следует.

Эти две функции выполняют одно и то же:

function a() {
    return functionReturningPromise().then(function (result) {
        return result + 1;
    });
}

async function b() {
    return (await functionReturningPromise()) + 1;
}
0 голосов
/ 04 мая 2019

Я бы попробовал что-то вроде этого:

const postReq = async (jwtToken) => {
  const body = {
    username: username,
    password: password,
  };

  try {
    const res = await fetch('http://api.myapi.cc/authenticate', {
      method: 'POST',
      headers: { "Content-Type": "application/json", "identify": jwtToken },
      body: JSON.stringify(body),
    })
    
    if (res) {
      if (res.status == 200) {
        return res.json();
      } else if (res.status == 401) {
        const data = res.json();
        console.log(data.message)
        throw ({ code: 401, msg: 'Wrong username or password' });
      } else if (res.status == 400) {
        throw ({ code: 400, msg: 'Unknown error, contact support for help. \nError code: 400' });
      }
    }
  } catch (err) {
    console.error(err)
  }

};

const Auth = async (username, password) => {
  const jwtData = {
    "origin": "launcher",
    "scope": "ec_auth"
  };

  try {
    const req_uuid = await this.setupUUID();
    if (req_uuid) {
      jwtData["req_uuid"] = req_uuid;
      const jwtToken = jwt.sign(jwtData, 'lulz');
      return await postReq(jwtToken);
    }
  } catch (err) {
    console.error(err);
  };
}
0 голосов
/ 04 мая 2019

await не должен использоваться с then.

let data = await this.setupUUID();

или

let data=null;
setupUUID().then(res=> data = res) 
...