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;
});
};
然而,在日志中我得到undefined
时console.log(rssAsJsonData)
。
然而,当调试我能够看到console.log(rss)
工作时,我改变身体是body: json.stringify("TESTING")
但是,它只在登录到控制台时才起作用,而不是当我试图将它传递给身体时body: body,
我似乎无法找到错误。我正在从Ruby迁移到javascript这个项目可能我错过了一些东西。
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通