Внутренняя ошибка сервера aws Лямбда-функция nodejs - PullRequest
0 голосов
/ 27 марта 2020

Я пробую демонстрацию с AWS лямбда-функцией, используя Ax ios и Cheerio, я получаю ответный ответ после вызова конечной точки как {сообщение: Внутренняя ошибка сервера}

exports.lambdaHandler = async (event, context) => {
    try {

       const axios = require('axios');
       const cheerio = require('cheerio');
         axios.get('https://www.kitco.com').then((response) => {
            const html = response.data;
            const $ = cheerio.load(html);
            const ask = $('#AU-ask').text();
            const bid = $('#AU-bid').text();
            const resbid = bid.slice(0,7);
            const resask = ask.slice(0,7);
            const result = {
                "ask": resask,
                "bid": resbid
            }
            return result;

        }); 
        response = {
            'statusCode': 200,
            'body': result
        }
    } catch (err) {
        console.log(err);
        return err;
    }

    return response 

};

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Подробную информацию об ошибке можно получить на вкладке монитора в веб-консоли Lambda. Гость, вы получаете сообщение об ошибке типа response is undefined в строке return response.

С вашим кодом строка return response будет выполняться сразу же после вызова функции, но response не определена в lambdaHandler сфера.

Я рекомендовал не смешивать синтаксис async/await с синтаксисом Promise (.then .catch), просто используйте один из них, я предлагаю использовать синтаксис async/await.

Функция Понравится:

exports.lambdaHandler = async (event, context) => {
  try {
    const axios = require('axios');
    const cheerio = require('cheerio');
    const response = await axios.get('https://www.kitco.com'); // wait until we get the response

    const html = response.data;
    const $ = cheerio.load(html);
    const ask = $('#AU-ask').text();
    const bid = $('#AU-bid').text();
    const resbid = bid.slice(0, 7);
    const resask = ask.slice(0, 7);

    const result = {
      "ask": resask,
      "bid": resbid
    }

    return {
      statusCode: 200,
      body: JSON.stringify(result), // If you working with lambda-proxy-integrations, the `body` must be a string
    }; // return to response the request
  } catch (err) {
    console.log(err);
    return {
      statusCode: 500, // Example, http status will be 500 when you got an exception
      body: JSON.stringify({error: err}),
    }
  }
};
0 голосов
/ 27 марта 2020

result явно не входит в область действия response, поэтому это приведет к типичной ошибке undefined.

Решением будет обработка логика c внутри axios.get обратного вызова, попробуйте это:

const axios = require('axios');
const cheerio = require('cheerio');

exports.lambdaHandler = (event, context) => {
  axios.get('https://www.kitco.com')
    .then((response) => {
      const html = response.data;
      const $ = cheerio.load(html);
      const ask = $('#AU-ask').text();
      const bid = $('#AU-bid').text();
      const resbid = bid.slice(0, 7);
      const resask = ask.slice(0, 7);

      const result = {
        statusCode: 200,
        body: {
          ask: resask,
          bid: resbid
        }
      };

      console.log(result);
    })
    .catch(err => {
      console.log(err);
    });
};
...