AWS-Lambda仅部分从Web下载文件

时间:2019-01-09 11:54:39

标签: javascript node.js amazon-web-services aws-lambda

我有一个AWS Lambda函数,该函数从链接(在代码中)下载随机YT视频的mp3文件。
在本地运行时,文件完成下载,最后文件大小约为8mb。 但是在Lambda上执行时,它只会下载大约17kb〜的文件。

let link = "http://cdl29.convert2mp3.net/download.php?id=youtube_ivpU-4LJaZk&key=hvjquS9UNKoq&d=y"

request
.get(link)
.pipe(fs.createWriteStream("/tmp/name"))
.on("finish", () => {
    console.log(fs.statSync("/tmp/name").size/1000000.0)
    fs.readFile('/tmp/name', function(err, content) {
        if (err) return callback(err)
        console.log("Got here")
    })
})

没有错误,一切都可以成功运行。但是看来fs.createWriteStream在Lambda上运行时实际上已经完成下载之前完成了。有什么想法吗?

编辑:实际上,在Elliot Nelson的帮助下,我看到它正在下载HTML文件。这很奇怪,因为我正在传递直接链接到脚本。 似乎它只是重定向到该网站的主页,这在我的家用计算机上从未发生过。

2 个答案:

答案 0 :(得分:0)

在下载完成之前,您的lambda似乎已完成执行。

您使用的是哪个节点版本?

如果是节点6->您不会在成功下载后调用回调,而只是在错误期间调用

如果它是节点8->完全不用考虑回调,而是使用Promise。 AWS实际上希望您返回已解决或被拒绝的承诺,表示成功或错误。

module.exports.handle = event => new Promise((resolve, reject) => {

   let link = "http://cdl29.convert2mp3.net/download.php?id=youtube_ivpU-4LJaZk&key=hvjquS9UNKoq&d=y"

  request
  .get(link)
  .pipe(fs.createWriteStream("/tmp/name"))
  .on("finish", () => {
      console.log(fs.statSync("/tmp/name").size/1000000.0)
      fs.readFile('/tmp/name', function(err, content) {
        console.log("Got here")
        err ? reject(err) : resolve(content);
      })
   })

});

答案 1 :(得分:0)

我的猜测是,由于服务器上的逻辑,您看到的行为有所不同。

可能性:

(1)您已在本地浏览器上登录(可能没有意识到)。尝试转到隐身窗口中的相同链接进行测试。该服务可能需要凭据,否则它将重定向您。

(2)服务正在检查用户代理。您可以尝试通过本地对URL进行CURL测试,而不是通过浏览器进行测试。

(3)被IP阻止-您的计算机上是否使用完全相同的JavaScript逻辑?如果可以访问它,则可以在您的计算机,另一台计算机(也许是EC2实例等)上尝试相同的代码,并查看它可能要检查的条件。

如果所有其他方法均失败,则可以直接与网站管理员联系,解释您的操作,然后查看是否有解决方法。他们可能会明确阻止您尝试执行的操作。