内部服务器错误AWS Lambda函数Node.js

时间:2020-03-26 23:01:50

标签: javascript node.js express aws-lambda aws-api-gateway

我正在尝试使用Axios和Cheerio的AWS Lambda函数进行演示,将端点称为{message:Internal Server Error}

后,我得到了响应。
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 :(得分:1)

result显然不在response范围内,因此将导致典型的undefined错误。

解决方案是处理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);
    });
};

答案 1 :(得分:1)

您可以在Lambda控制台Web的“监视器”选项卡中获取错误详细信息。抱歉,您在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}),
    }
  }
};
相关问题