我对承诺比较陌生,在使用节点-ytdl-core时,我在两件事上遇到了麻烦。
exports.downloadMP3 = function(bot, msg, sSuffix) {
return Promise
.all([
ytdl(sSuffix, {filter : 'audioonly',}).pipe(fs.createWriteStream('audio.mp3')),
promiseTitle(sSuffix)
])
.then(function(results) {msg.channel.sendFile('audio.mp3', results[1], '', '')})
.catch(error => console.error(error));
}
function promiseTitle(sSuffix) {
return new Promise(function (resolve, reject) {
ytdl.getInfo(sSuffix, function(err, info) {
if (err) reject(err);
console.log(info.title);
return resolve(info.title);
});
});
}当我使用上面的代码时,返回的标题是一个沿25998454d48491.V的字符串,尽管控制台会记录正确的标题。意思是承诺不会返回我想要的价值。
此外,createWriteStream在文件被发送(sendFile)之前不会被解析,这意味着我得到了一个0字节文件,尽管在文件系统中完成了文件的下载并具有正确的大小/内容。
因此,我的问题是,如何在我的承诺中返回正确的值,并将createWriteStream转化为承诺?
提前谢谢。
发布于 2017-06-03 23:14:47
弄明白了。标题很好,但是sendFile()不允许文件名中的'/‘。我正在测试的视频中有那个角色。此外,在下面的代码中,通过使用流事件将流的所有数据附加到数组中,我设法将ytdl流转换为缓冲区。可以使用另一个事件( end事件)最终发送缓冲区。
exports.downloadMP3 = function(bot, msg, sSuffix) {
return Promise
.all([
promiseTitle(sSuffix)
])
.then(function(results) {
let stream = ytdl(sSuffix, {filter : 'audioonly',});
let aData = [];
stream.on('data', function(data) {
aData.push(data);
});
stream.on('end', function() {
let buffer = Buffer.concat(aData);
let title = results[0].replace(/[^a-zA-Z0-9]/g,'_');
console.log(title);
msg.channel.sendFile(buffer, `${title}.mp3`, '', '');
});
})
.catch(error => console.error(error));
}
function promiseTitle(sSuffix) {
return new Promise(function (resolve, reject) {
ytdl.getInfo(sSuffix, function(err, info) {
if (err) reject(err);
console.log(info);
resolve(info.title);
});
});
}https://stackoverflow.com/questions/44267350
复制相似问题