JavaScript:在AWS Lambda Node应用程序中将RSS转换为JSON

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript:在AWS Lambda Node应用程序中将RSS转换为JSON相关的知识,希望对你有一定的参考价值。

我目前正致力于在AWS Lambda上编写函数。我想将RSS提要转换为JSON,并在进入Lambda端点时将其作为响应提供给身体。

我正在使用npm package将RSS转换为JSON。但是,当我运行代码时。我看到我在转换RSS URL时未定义。这是以下代码:

const feed = require('rss-to-json');

exports.handler = async (event) => {
  let rssFeed = event.queryStringParameters.rssFeed;
  let rssAsJsonData = convertRssIntoJson(rssFeed);

  return sendRes(200, rssAsJsonData);
};

const sendRes = (status, body) => {
  var response = {
    isBase64Encoded: true|false,
    statusCode: status,
    headers: {
      "Content-Type": "application/json"
    },
    body: body,
  };
  return response;
};

function convertRssIntoJson (rssFeed) {
  console.log(rssFeed);
  return feed.load(rssFeed, function(err, rss){
    if(err) {
      console.log("Error: ${err}");
      return;
    }
    console.log(rss)
    return rss;
  });
};

然而,在日志中我得到undefinedconsole.log(rssAsJsonData)enter image description here

然而,当调试我能够看到console.log(rss)工作时,我改变身体是body: json.stringify("TESTING") enter image description here

但是,它只在登录到控制台时才起作用,而不是当我试图将它传递给身体时body: body,我似乎无法找到错误。我正在从Ruby迁移到javascript这个项目可能我错过了一些东西。

我正在使用Postman打电话:enter image description here

答案
function convertRssIntoJson (rssFeed) {
  console.log(rssFeed);
  return feed.load(rssFeed, function(err, rss){
    if(err) {
      console.log("Error: ${err}");
      return;
    }
    console.log(rss)
    return rss;
  });
};

上面的代码是回调。在引擎盖下,feed.load是异步的,这使得回调可以异步执行。

现在,当您调用这样的函数时

let rssAsJsonData = convertRssIntoJson(rssFeed);

你在rss里面的convertRssIntoJson对象还没有任何值,因为到目前为止还没有填充回调。这是你的undefined来自哪里。

默认情况下,回调本身不会使代码异步,但NodeJS使用非阻塞IO模型,并且由于feed.load是IO调用,因此它将异步执行。

你现在有几个选择,但我只列出两个。一个不那么好的解决方案:

1)修复它的不太好的方法是在convertRssIntoJson函数中添加一个回调作为参数,并将rss对象的值传递给上游。不太好的完整代码可以在下面找到:

const feed = require('rss-to-json');

exports.handler = async (event) => {
    let rssFeed = event.queryStringParameters.rssFeed;

    convertRssIntoJson(rssFeed, (err, data) => {
        if (err) {
            return sendRes(500, { message: 'There was an err: ' + err.message })
        }
        return sendRes(200, data)
    })
};

const sendRes = (status, body) => {
    var response = {
        isBase64Encoded: true | false,
        statusCode: status,
        headers: {
            "Content-Type": "application/json"
        },
        body: body,
    };
    return response;
};

const convertRssIntoJson = (rssFeed, callback) => {
    console.log(rssFeed);
    feed.load(rssFeed, function (err, rss) {
        if (err) {
            console.log("Error: ${err}");
            callback(err, undefined)
        }
        console.log(rss)
        callback(undefined, rss)
    });
};

2)这个漂亮,干净,优雅和推荐的解决方案。将你的回调包含在Promise中,就像这样

function convertRssIntoJson(rssFeed) {
    console.log(rssFeed);
    return new Promise((res, rej) => {
       feed.load(rssFeed, function (err, rss) {
            if (err) {
                console.log("Error: ${err}");
                return rej(err)
            }
            console.log(rss)
            return res(rss)
        });
    })
};

由于你的处理程序是async,这意味着它只能在Promises上使用await

所以你的客户端代码现在很简单:

return sendRes(200, await convertRssIntoJson(rssFeed));

你的最终代码看起来像(我已经重构了一点来使用箭头函数):

const feed = require('rss-to-json');

exports.handler = async (event) => {
    let rssFeed = event.queryStringParameters.rssFeed;

    return sendRes(200, await convertRssIntoJson(rssFeed));
};

const sendRes = (status, body) => {
    var response = {
        isBase64Encoded: true | false,
        statusCode: status,
        headers: {
            "Content-Type": "application/json"
        },
        body: body,
    };
    return response;
};

const convertRssIntoJson = (rssFeed) => {
    console.log(rssFeed);
    return new Promise((res, rej) => {
        feed.load(rssFeed, (err, rss) => {
            if (err) {
                console.log("Error: ${err}");
                return rej(err)
            }
            console.log(rss)
            return res(rss)
        });
    })
};

如果您想了解有关async / await的更多信息,可以在here中看到它。

编辑:为解决方案添加代码重构和代码1)

以上是关于JavaScript:在AWS Lambda Node应用程序中将RSS转换为JSON的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda 函数总是返回 null (Node/Javascript)?

如何配置 Visual Studio Code 以解析 AWS Lambda 层的输入路径 (javascript)

JavaScript:在AWS Lambda Node应用程序中将RSS转换为JSON

AWS Lambda - Nodejs:分配失败 - JavaScript 堆内存不足

您是否可以使用除Javascript以外的语言使用Lambda @ Edge修改AWS CloudFront事件的URI?

javascript CloudWatch到AWS Lambda到Slack Channel Alerts和Charts。通过SNS主题通过Lambda函数将CloudWatch警报发布到Slack通