【发布时间】:2021-02-20 04:00:41
【问题描述】:
我正在尝试使用 lambda 将文件上传到 S3。 该代码是关于从网络上抓取数据并制作 CSV 文件。
原始代码(没有 AWS,只需抓取并创建 CSV)经过测试并且工作正常。 所以我稍微修改了它以使用 lambda 和 s3。
我创建了 S3 存储桶。 我制作了 lambda 层。 我做了 IAM 角色。(AmazonS3FullAccess) 我将它附加到 lambda。
我想我做了我需要的一切。当我单击测试按钮时,会打印“成功”。 但是,当我检查我的 S3 存储桶时,什么都没有。
有什么我错过的吗?谢谢。
这是我的 lambda 代码。
const request = require('request');
const Iconv = require('iconv').Iconv;
const cheerio = require('cheerio');
const ObjectsToCsv = require('objects-to-csv');
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
const today = new Date;
const date_string = `${today.getMonth()}/${today.getDate()}`;
const BUCKET_NAME = 'naverfinance';
exports.handler = async (event) => {
class Stock {
constructor(
name, rank, price, change_inValue, change_inPercent, updown) {
this.name = name;
this.rank = rank;
this.price = price;
this.change_inValue = change_inValue;
this.change_inPercent = change_inPercent;
this.updown = updown;
}
}
request({ url: 'https://finance.naver.com/sise/sise_quant.nhn', encoding: null }, function(response, body) {
const euckr_to_utf8 = new Iconv('euc-kr', 'utf8');
const koreanHTML = euckr_to_utf8.convert(body).toString();
const $ = cheerio.load(koreanHTML);
let name, rank, price, change_inValue, change_inPercent, updown;
const table = $('.type_2').children('tbody').children('tr');
//3번쨰부터 5개, 빈라인 3개, 이렇게 해서 종목 100개
for(let i = 1; i < table.length; ++i) {
const tr = table[i];
if(tr.children.length === 1) {
continue;
}
const tds = tr.children;
for(let j = 0; j < tds.length; ++j) {
const td = tds[j];
if(td.type == 'text') {
continue;
}
const td_data = td.children;
if(j == 1) {
rank = td_data[0].data;
}
else if(j == 3) {
name = td_data[0].children[0].data;
}
else if(j == 5) {
price = parseInt(td_data[0].data.replace(/[,]/g,''));
}
else if(j == 7) {
let data = 0;
if(td_data[2].children != undefined) {
data = parseInt(td_data[2].children[0].data.replace(/[\n\t,]/g,''));
}
change_inValue = data;
}
else if(j == 9) {
change_inPercent = td_data[1].children[0].data.replace(/[\n\t%]/g,'');
if (change_inPercent.indexOf('.') !== -1) { //소수
change_inPercent = parseFloat(change_inPercent.replace(/,/g,''));
}
else { //정수
change_inPercent = parseInt(change_inPercent.replace(/,/g,''));
}
if(change_inPercent < 0) {
updown = '하락';
change_inValue = -change_inValue;
}
else if(change_inPercent > 0) {
updown = '상승';
change_inValue = change_inValue;
}
else {
updown = '그대로';
change_inValue = 0;
}
const stock = new Stock(
name, rank, price, change_inValue, change_inPercent, updown);
s3.putObject({
Bucket: BUCKET_NAME,
Key: date_string,
ContentType: 'text/plain',
Body : 'test' //new ObjectsToCsv(stock).toString()
})
}
}
}
});
};
移除异步之后。
Response:
{
"errorType": "Error",
"errorMessage": "Bad argument.",
"trace": [
"Error: Bad argument.",
" at convert (/opt/nodejs/node_modules/iconv/index.js:103:11)",
" at Iconv.convert (/opt/nodejs/node_modules/iconv/index.js:63:12)",
" at Request._callback (/var/task/index.js:28:42)",
" at Request.self.callback (/opt/nodejs/node_modules/request/request.js:185:22)",
" at Request.emit (events.js:315:20)",
" at Request.EventEmitter.emit (domain.js:482:12)",
" at Request.<anonymous> (/opt/nodejs/node_modules/request/request.js:1154:10)",
" at Request.emit (events.js:315:20)",
" at Request.EventEmitter.emit (domain.js:482:12)",
" at IncomingMessage.<anonymous> (/opt/nodejs/node_modules/request/request.js:1076:12)"
]
}
【问题讨论】:
-
您能否添加任何调试 (
console.log) 行来检查它是否正在运行,这也是一个异步 Lambda 函数,因此它可能不会等待请求完成 -
@ChrisWilliams 你是对的。我在请求之前、之后和请求中都放置了 console.log("ok")。当 console.log 在请求中时,不会打印 ok。我能做些什么?我尝试删除异步(错误说错误的参数)并将等待放在请求前面(成功但在 s3 没有。)
-
这可能是函数的异步部分,将
exports.handler = async (event)改为exports.handler = (event)。 -
@ChrisWilliams 感谢您的帮助。但是改成
exports.handler = (event)后,我得到了错误信息。我把它放在原始问题帖子上,因为它太长了。
标签: node.js amazon-web-services amazon-s3 aws-lambda