Node.js 将节点中的一系列大型文件上载到web API
我试图创建一个节点脚本来遍历一个大文件文件夹(包含1小时音乐集的MP3),并通过API将它们上传到Mixcloud。它可以工作,除非它达到API速率限制并且需要等待x秒——我设置了一个超时并返回到开始,但是在设置的时间量之后,进程退出并且不记录任何有用的输出。这是由于我的代码中的错误,还是因为我运行它的方式?我目前正在使用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
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