Node.js 将节点中的一系列大型文件上载到web API

Node.js 将节点中的一系列大型文件上载到web API,node.js,rest,api,request,mixcloud,Node.js,Rest,Api,Request,Mixcloud,我试图创建一个节点脚本来遍历一个大文件文件夹(包含1小时音乐集的MP3),并通过API将它们上传到Mixcloud。它可以工作,除非它达到API速率限制并且需要等待x秒——我设置了一个超时并返回到开始,但是在设置的时间量之后,进程退出并且不记录任何有用的输出。这是由于我的代码中的错误,还是因为我运行它的方式?我目前正在使用sudo nohup node index.js>log.log运行它,这是错误的吗?我的最终目标是一个脚本,可以在我们电台每天结束时运行,并上传存档文件 const rest

我试图创建一个节点脚本来遍历一个大文件文件夹(包含1小时音乐集的MP3),并通过API将它们上传到Mixcloud。它可以工作,除非它达到API速率限制并且需要等待x秒——我设置了一个超时并返回到开始,但是在设置的时间量之后,进程退出并且不记录任何有用的输出。这是由于我的代码中的错误,还是因为我运行它的方式?我目前正在使用
sudo nohup node index.js>log.log运行它,这是错误的吗?我的最终目标是一个脚本,可以在我们电台每天结束时运行,并上传存档文件

const restler = require('restler');
const fs = require('fs');
const readDir = require('readdir');
const powerOff = require('power-off');

const options = {
  folder: 'files',
  completefolder: 'complete',
  accesstoken: 'xxxxxxxxxxxxxxxxxxxxxxx'
}

// shut down computer
const shutDown = () => {powerOff((err, stderr, stdout) => {
      if(!err && !stderr) {
          console.log(stdout);
      }
  })
};

// uploadFile uploads file with restler to mixcloud, if api returns rate limiting object, try again in x seconds
const uploadFile = (folder, filename) => {
  const filepath = `./${folder}/${filename}`
  fs.stat(`./${folder}/${filename}`, function(err, stats) {
      const size = stats.size;
      restler.post(`https://api.mixcloud.com/upload/?access_token=${options.accesstoken}`, {
          multipart: true,
          data: {
              "mp3": restler.file(`./${folder}/${filename}`, null, size, null, 'audio/mpeg'),
              "name": filename,
              // "unlisted": true

              // more data can be added here depending on changes in workflow, automate images etc
          }
      }).on("complete", function(data) {
          const returned = JSON.parse(data);
          if (returned.error) {
            if (returned.error.type == "RateLimitException") {
              // try again in x seconds
              console.log(`uploading too fast, retrying upload of ${filename}after ${returned.error.retry_after} seconds`);
              setTimeout(() => {(folder, filename) => uploadFile}, returned.error.retry_after*1000);
            }
            else {
              console.log('non-rate-limiting error');
              console.log(returned);
            }
          }
          else {
            console.log('Success!');
            console.log(returned);
            // move uploaded files into completed folder
            fs.rename(`./${folder}/${filename}`, `./${options.completefolder}/${filename}`, (err)=> {
              if (err) {
                console.log(err)
              }
              else {
                counter += 1;
                console.log(counter);
                if (counter === files.length) {
                  console.log('done');
                  shutDown();
                }
              }
            })
          }
      });
  });
};

// get all mp3s and upload all of them
const files = readDir.readSync(`./${options.folder}`, ['**.mp3'] );
let counter = 0;
for (var i = 0; i < files.length; i++) {
  uploadFile(options.folder, files[i])
};
const restler=require('restler');
常数fs=要求('fs');
const readDir=require('readDir');
const powerOff=需要(“断电”);
常量选项={
文件夹:“文件”,
completefolder:“完成”,
accesstoken:'xxxxxxxxxxxxxxxxxxxxxxxx'
}
//关闭计算机
const shutDown=()=>{powerOff((err,stderr,stdout)=>{
如果(!err&&!stderr){
控制台日志(stdout);
}
})
};
//uploadFile使用restler将文件上载到mixcloud,如果api返回速率限制对象,请在x秒后重试
const uploadFile=(文件夹,文件名)=>{
常量文件路径=`./${folder}/${filename}`
fs.stat(`./${folder}/${filename}`,函数(err,stats){
常量大小=stats.size;
雷斯特勒邮政公司(`https://api.mixcloud.com/upload/?access_token=${options.accesstoken}`{
多部分:正确,
数据:{
“mp3”:restler.file(`./${folder}/${filename}`,null,size,null,'audio/mpeg'),
“名称”:文件名,
//“未列出”:正确
//根据工作流程的变化,可以在此处添加更多数据,自动化图像等
}
}).on(“完成”,功能(数据){
const returned=JSON.parse(数据);
if(返回。错误){
if(returned.error.type==“RateLimitException”){
//请在x秒后重试
log(`upload too fast,在${returned.error.retry}秒之后重试${filename}的上载)`;
setTimeout(()=>{(文件夹,文件名)=>uploadFile},返回。错误。在*1000之后重试);
}
否则{
log(“非速率限制错误”);
console.log(返回);
}
}
否则{
console.log('Success!');
console.log(返回);
//将上载的文件移到已完成的文件夹中
fs.rename(`./${folder}/${filename}`、`./${options.completefolder}/${filename}`、(err)=>{
如果(错误){
console.log(错误)
}
否则{
计数器+=1;
控制台日志(计数器);
if(计数器===files.length){
console.log('done');
关机();
}
}
})
}
});
});
};
//获取所有MP3并上传它们
const files=readDir.readSync(`./${options.folder}`,['**.mp3']);
设计数器=0;
对于(var i=0;i