AWS Lambda получает данные из внешнего публичного API (базовый) - PullRequest
0 голосов
/ 27 мая 2019

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

Я сократил код, чтобы сделать его максимально простым, чтобы он был простым. Публичный API: https://swapi.co/api/people/1/

Как я могу получить данные из общедоступного API?

const https = require('https');

exports.handler = async (event) => {

    var options = {
      method: 'GET',
      host: 'https://swapi.co/api/people/1/',

    };

     console.log('options', options);

     const req = https.request(options, (res) => {
         console.log('statusCode: ${res.statusCode}')
         console.log(JSON.stringify(res))
     });


    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

Файл журнала в редакторе AWS показывает:

START RequestId: 3ba3f23a-11c2-40af-b9e7-0258a6531728 Version: $LATEST
2019-05-27T16:17:44.839Z    3ba3f23a-11c2-40af-b9e7-0258a6531728    INFO    options { method: 'GET', host: 'https://swapi.co/api/people/1/' }
END RequestId: 3ba3f23a-11c2-40af-b9e7-0258a6531728
REPORT RequestId: 3ba3f23a-11c2-40af-b9e7-0258a6531728  Duration: 305.90 ms Billed Duration: 400 ms     Memory Size: 128 MB Max Memory Used: 26 MB  

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Код ниже работает

const http = require("https");

exports.handler = async(event, context, callback) => {

  var options = {
    "method": "GET",
    "hostname": "app.casejacket.com",
    "port": null,
    "path": "/api/",
    "headers": {
      "cache-control": "no-cache",
      "Content-Type": "application/json"
    }
  };

  await new Promise((resolve, reject) => {
    console.log('Promise.. ');

    var req = http.request(options, function (res) {
      var chunks = [];

      res.on("data", function (chunk) {
        chunks.push(chunk);
      });

      res.on("end", function () {
        var body = Buffer.concat(chunks);
        let result = JSON.parse(body.toString());
        console.log(body.toString());
        resolve(body.toString());
        callback(null, result)
      });
    });

    req.end();
  });

  callback();

};
0 голосов
/ 27 мая 2019

Было несколько проблем с вашим кодом:

Функция callback, переданная в обработчик, запускает конец выполнения или вызывается для вас при выходе из кода, если вы сами его не вызываете. Я не совсем уверен, как это взаимодействует с асинхронным кодом JavaScript, но это могло привести к преждевременному завершению работы вашего кода, если бы вы нигде его не вызывали.

Вы используете метод async, что является хорошей практикой, но ваш вызов покоя не использует его, а использует метод обратного вызова. Это можно преобразовать в асинхронный вызов, как я покажу ниже, что немного облегчает понимание кода.

Я думаю, что самая большая проблема в том, что ваши options не правы. Вам не нужно https в начале хоста (потому что он уже знает схему), и путь не может быть в хосте. Сначала я этого не заметил.

Это работает для меня, хотя вы не можете вызвать JSON.stringify для всего ответа, потому что это сложный объект, а не просто модель.

const https = require('https');

exports.handler = async (event, context, callback) => {
    var options = {
        method: 'GET',
        host: 'swapi.co',
        path: '/api/people/1/',
    };
    await new Promise((resolve, reject) => {
        let request = https.request(options, response => {
            try {
                // do whatever
            } finally {
                resolve();
            }
        });
        request.on('error', (e) => reject(e));
        request.end();
    });
    callback();
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...