我有一个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")
})
})没有错误,一切都运行成功。但在Lambda上运行时,fs.createWriteStream似乎在下载完成之前就完成了。有什么想法吗?
编辑:实际上,在Elliot Nelson的帮助下,我看到它正在下载一个HTML文件。这很奇怪,因为我传递了一个到脚本的直接链接。似乎它只是重定向到网站的主页,这是我从未见过的发生在我的家用机器上。
发布于 2019-01-09 20:08:13
看起来您的lambda在下载完成之前就完成了执行。
您使用的节点版本是什么?
如果是Node6 ->,则不是在成功下载后调用回调,而是仅在错误期间调用
如果是Node8的->,那就把回调都忘了,用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);
})
})
});发布于 2019-01-09 22:19:27
我的猜测是,由于服务器上的逻辑,您看到了行为上的不同。
可能性:
(1)您已在本地浏览器上登录(可能没有意识到)。尝试转到匿名窗口中的相同链接来测试这一点。该服务可能需要凭据,否则它会重定向您。
(2)业务正在检查用户代理。您可以尝试在本地卷曲URL来测试这一点,而不是通过浏览器。
(3)它是通过IP阻塞的--在您的机器上也可以使用完全相同的javascript逻辑吗?如果您可以访问它,您可以在您的机器、另一台机器、可能是EC2实例等上尝试相同的代码,并查看它可能检查的标准。
如果所有其他方法都失败了,您可以直接联系网站管理员,解释您正在做什么,并查看是否有解决方法。他们可能会明确地阻止你正在尝试做的事情。
https://stackoverflow.com/questions/54109562
复制相似问题