Node多文件上传 报错connect ETIMEDOUT

Node在上传多文件(JS和CSS, 每个文件不超过100k)到七牛的情况下, 极少数会上传成功, 大多数总是在第21秒的时候返回 " connect ETIMEDOUT "(有时候也会返回 " write ECONNRESET " 和 " read ECONNRESET ")

代码如下:

var fs = require('fs');
var qiniu = require('qiniu');

var accessKey = '********';
var secretKey = '********';

var mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
var staticPath = 'C:/files/';
var prefix = 'static';
var bucket = 'static';

var config = new qiniu.conf.Config();
config.zone = qiniu.zone.Zone_z1;
var formUploader = new qiniu.form_up.FormUploader(config);
var putExtra = new qiniu.form_up.PutExtra();
putExtra = null;

// 文件上传方法
function uploadFile(localFile) {
  // 配置上传到七牛云的完整路径
  const key = localFile.replace(staticPath, prefix)
  const options = {
    scope: bucket + ":" + key,
    returnBody: '{"key":"$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"}'
  }
  const putPolicy = new qiniu.rs.PutPolicy(options)
  // 生成上传凭证
  const uploadToken = putPolicy.uploadToken(mac)
  // 上传文件
  formUploader.putFile(uploadToken, key, localFile, putExtra, function (respErr, respBody, respInfo) {
    if (respErr) {
      throw respErr
    }
    if (respInfo.statusCode == 200) {
    } else {
      console.log(respInfo.statusCode);
      console.log(respBody);
    }
  })
}
// 目录上传方法
function uploadDirectory(dirPath) {
  fs.readdir(dirPath, function (err, files) {
    if (err) throw err
    // 遍历目录下的内容
    files.forEach(item => {
      let path = `${dirPath}/${item}`
      fs.stat(path, function (err, stats) {
        if (err) {
          throw err
        }
        // 是目录就接着遍历 否则上传
        if (stats.isDirectory()) uploadDirectory(path)
        else uploadFile(path, item)
      })
    })
  })
}

fs.exists(staticPath, function (exists) {
  if (!exists) {
    console.log('目录不存在!')
  } else {
    console.log('开始上传...')
    uploadDirectory(staticPath)
  }
})


fs读取文件夹下所有文件, 然后循环调用putFile方法上传, 总是在上传到21秒的时候报错:

clipboard.png
报错过的文件是没有上传成功的, 请问大佬到底是啥原因导致的, 该怎么去解决呢, 而且为什么程序执行完成之后Node并不会自动退出呢...

阅读 4.7k
2 个回答

这个应该是本地网络的限制
可以调低并发量试试

说一说自己的解决方案吧:

由于是整体打包的文件必须全部上传完整, 否则会影响整网站的运行, 所以为了保证所有的文件都是上传成功, 必须给异常增加捕获, 在捕捉到异常之后, 重新上传抛出异常的文件, 保证每个文件都能够上传成功, 这样的解决方式暂时还未发现弊端, 如果有大佬发现其中会导致什么其它的问题的话, 还望指正!(我这个方法说起来可能只算是一个"保证文件完全上传"的解决方案, 对于网络这块的错误并没有解决, 只是绕过去了而已, 还是希望大佬能够指出这个问题所在的根本原因, 多谢!)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
七牛云问答
子站问答
访问
宣传栏