Асинхронная обработка для POST-запроса Node.js - PullRequest
0 голосов
/ 26 января 2019

Я относительно новичок в Node.js и создаю сервер, который будет принимать запрос POST от мобильного приложения, тело которого содержит учетные данные, которые затем будут проверены через GET на другом сервере.Если ответ GET подтверждает учетные данные, то извлекается UID и вызывается firebase admin SDK для создания пользовательского токена.Вот фрагмент кода и две функции, которые вызываются для (a) проверки учетных данных и (b) генерации пользовательского токена.

//Listen for app to POST Credential
  app.post('/', function(request, response) {
    console.log('Request Body: ',request.body);
    var Credential = request.body;

    //Validate Credential
    validateCredential(Credential)

    //Get Authorization Token
    getToken(userID)

    //Return Token for POST Response
    response.set('Content-Type','Text');
    response.end(firebaseAuthToken);

  });
  //Create listener for POST function
  app.listen(port, function() {
    console.log('AuthServer is running and listening on port '+port);
  });


//Function to Validate Credential 
async function validateCredential(crdntl) {
  //Call Service to validate Credential received
  axios({
  method: 'get',
  url: 'https://.....',
  })
  .then(function(response) {
    ...check credential validation data
  })
  .catch(function (error) {
  console.log('ERROR: Unable to Validate Credential');
  //Unable to create Validate Credential so return error message for POST response
  return ('ERROR1');
  });
}

async function getToken(uid) {
  admin.auth().createCustomToken(uid)
    .then(function(customToken) {
    var AuthToken = customToken;
    var decoded = jwt.decode(AuthToken);
    console.log('Decoded Token: '+'\n',decoded);
    //Return Authorization Token for POST response
    return (AuthToken);
    })
    .catch(function(error) {
    console.log('ERROR: Unable to Create Custom Token', error);
    //Unable to create Token so return error message for POST response
    return ('ERROR2');
    });
  }
}

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

Реальная проблема заключается в том, как заставить ответ POST ожидать обратного вызова от функции getToken, поскольку конечной целью является передача пользовательского токена.вернуться к мобильному приложению в теле ответа POST.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 26 января 2019

Ваши функции validateCredential и getToken уже async, которые, в свою очередь, возвращают обещание. Чтобы подождать в функции POST, чтобы эти функции отправили ответ, Вы должны сделать POST функцию async, а затем используйте ключевое слово await при вызове этих двух функций, когда вы используете await, выполнение функции ожидает, пока ответ функции, который разрешается Promise, приведен в качестве примера кода.

//Listen for app to POST Credential
app.post('/', async function(request, response) {
    console.log('Request Body: ',request.body);
    var Credential = request.body;

    //Validate Credential
    var userId = await validateCredential(Credential) //Waits until userId comes

    //Get Authorization Token
    var firebaseAuthToken = await getToken(userID) //waits until Token comes

    //Return Token for POST Response
    response.set('Content-Type','Text');
    response.end(firebaseAuthToken);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...