Используете данные из http-запроса Javascript aysnc?(без сервера) - PullRequest
0 голосов
/ 29 ноября 2018

Я использую серверный модуль nodejs для создания лямбда-функции aws.

'use strict';
const request = require('request');
const options = {
  url: 'https://api.mysportsfeeds.com/v2.0/pull/nfl/2018-regular/games.json',
  method: 'GET',
  headers: {
    "Authorization": "Basic " + Buffer.from("1da103" 
+ ":" + "MYSPORTSFEEDS").toString('base64')
  }
}

//this is automatically called by aws
module.exports.hello = async (event, context) => {
  let result;
  request.get(options, (error, response, body) => {
    result = JSON.parse(body).lastUpdatedOn; //never happens cuz of async
  });
  return {
    statusCode: 200,
    body: JSON.stringify({
      message: 'Go Serverless v1.0! Your function executed successfully!',
      input: result,
    }),
  };
};

У меня проблема в том, что я не могу вернуть вывод из запроса get, потому что присвоениепеременная результата (в асинхронном запросе get) происходит после оператора return.Я не думаю, что смогу превратить внешнюю функцию в функцию обратного вызова для запроса get.Как я мог обойти это?

1 Ответ

0 голосов
/ 29 ноября 2018

Альтернативой может быть извлечение логики запроса и помещение ее в новую функцию.

Помните, что вам нужно отлавливать любые ошибки, поэтому используйте для этого блок try-catch.

'use strict';
const request = require('request');
const options = {
    url: 'https://api.mysportsfeeds.com/v2.0/pull/nfl/2018-regular/games.json',
    method: 'GET',
    headers: {
        "Authorization": "Basic " + Buffer.from("1da103"
            + ":" + "MYSPORTSFEEDS").toString('base64')
    }
};

function getResult() {
    return new Promise(function (resolve, reject) {
        request.get(options, (error, response, body) => {
            if (error) return reject(error);
            resolve(JSON.parse(body).lastUpdatedOn); //never happens cuz of async
        });
    });
}

//this is automatically called by aws
module.exports.hello = async (event, context) => {
    let result = await getResult();
    return {
        statusCode: 200,
        body: JSON.stringify({
            message: 'Go Serverless v1.0! Your function executed successfully!',
            input: result,
        }),
    };
};
...