我有一个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文件。这很奇怪,因为我正在传递直接链接到脚本。 似乎它只是重定向到该网站的主页,这在我的家用计算机上从未发生过。
答案 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实例等)上尝试相同的代码,并查看它可能要检查的条件。
如果所有其他方法均失败,则可以直接与网站管理员联系,解释您的操作,然后查看是否有解决方法。他们可能会明确阻止您尝试执行的操作。