管道在localhost上工作,但不在远程nodejs上工作

时间:2016-12-15 21:11:04

标签: javascript node.js youtube stream pipe

我正在尝试使用ytdl-core模块将youtube音频下载到我的本地磁盘(我的计算机上的某个路径)。

我创建了一个API,我可以使用请求的youtube网址和我想要保存文件的目标文件夹来调用它。

app.get('/api/downloadYoutubeVideo', function (req, res) {  
var videoUrl = req.query.videoUrl;  
var destDir = req.query.destDir;    

ytdl.getInfo(videoUrl, function(err, info){
        var videoName = info.title.replace('|','').toString('ascii');       

        var stream = ytdl(videoUrl, { filter: 'audioonly'})
                       .pipe(fs.createWriteStream(destDir + '\\' + videoName + '.mp3'));

        stream.on('finish', function() {
            res.writeHead(204);
            res.end();
        });             
    });         
}); 

问题是当我在我的localhost上调用api时(例如:localhost:11245 / api / downloadYoutubeVideo?videoUrl = https://www.youtube.com/watch?v=E5kJDWQSBUk&destDir=C:\ test) 它工作正常,文件确实下载到“C:\ test”。

但是当我在遥控器上调用api时(例如:http://sometest.cloudno.de/api/downloadYoutubeVideo?videoUrl=https://www.youtube.com/watch?v=02BAlrAkuCE&destDir=C:\ test)

它不会在目录中创建文件......

我搜索了答案,但没有找到答案......

1 个答案:

答案 0 :(得分:0)

您的遥控器上是否已存在C:\test?如果不是,则在创建目录之前不能使用fs.createWriteStream(),它不会隐式为您创建目录。由于您没有收听'error'事件,因此您甚至不知道这是问题,因为您没有捕获它。

下面的代码示例将检查是否存在destDir,如果它不存在,则会在继续之前创建它。

const fs = require('fs');
const sep = require('path').sep;

function checkAndMakeDir(dir, cb) {
  fs.access(dir, (err) => {
    if (err)
      fs.mkdir(dir, (err) => {
        if (err)
          return cb(err);

        return cb();
      });
    else
      return cb();
  });
}

app.get('/api/downloadYoutubeVideo', function (req, res) {
  let videoUrl = req.query.videoUrl;
  let destDir = req.query.destDir;

  checkAndMakeDir(destDir, (err) => {
    if (err) {
      res.writeHead(500);
      return res.end();
    }

    ytdl.getInfo(videoUrl, function (err, info) {
      let videoName = info.title.replace('|', '').toString('ascii');
      let saveStream = fs.createWriteStream(`${destDir}${sep}${videoName}.mp3`);

      saveStream.once('error', (err) => {
        console.log(err);
        res.writeHead(500);

        return res.end();
      });

      saveStream.once('finish', () => {
        res.writeHead(204);
        return res.end();
      });

      ytdl(videoUrl, {filter: 'audioonly'})
        .once('error', (err) => {
          console.log('Read Stream Error', err);

          res.writeHead(500);
          return res.end();
        })
        .pipe(saveStream);
    });
  });
});