NodeJs方法链接fs.mkdir和fs.rename

时间:2014-05-17 21:07:26

标签: node.js express

我正在处理文件上传程序脚本,该脚本会创建一个新文件夹(基于时间戳)并将上传的文件移动到创建的文件夹中。

Sometimes it works有时我会收到ENOENT重命名错误(文件/文件夹不存在)。

以下代码位于我的邮寄路线中:

var form = new multiparty.Form({
   uploadDir: "C:"+ path.sep + "files"
});

form.parse(req, function(err, fields, files) {

   var dirPath = "C:"+ path.sep + "files" + path.sep + +new Date;

   fs.mkdir(dirPath, 0777, function(err, dirPath){

      if (err) console.error(err);

      console.log("Created new folder");

      fs.rename(files.file[i].path, dirPath + path.sep + files.file[i].originalFilename, function(err){

         if (err) console.error(err);

         console.log("Moved file");

      });

   }(err, dirPath));

   next();
});

我使用express(4)multiparty module。 正如您所看到的,我正在使用async函数。

所以问题是:我的代码出了什么问题?

修改

我正在谈论的错误:"Error: ENOENT, rename 'C:\files\7384-1r41cry.png'"

这与竞争条件有关。使用fs.mkdirSync一切正常。

2 个答案:

答案 0 :(得分:0)

好的一些事情......

  1. 你真的应该开始使用promises,使代码更容易阅读,错误处理方式更优越。我通常使用when.js,但还有其他选择

  2. 您应该抛出错误或返回错误,或者即使先前的操作失败,您也会尝试继续运行该功能。

  3. 你做了

    if (err) console.error(err);
    

    应该是

    if (err) thorw err;
    

答案 1 :(得分:0)

我猜这里会发生某种竞争状况 这种东西容易出错,难以正确使用。

我通常使用gulp来表达这种东西,也许你应该这样做:)

将整个目录树复制到其他目录中并不容易。

gulp.src('./inputDir/**/*').pipe(gulp.dest('./outputDir')

inputDir中的所有文件都会被复制outputDir

但也许应对不是一种选择。文件可能太大了,对吧? 让它破解一下让它按照我们想要的方式工作。

var fs = require('fs')
, gulp = require('gulp')
, thr = require('through2').obj
, SRC = './test/**/*.{css,html,js}' // it could be 'my/file/located/here'
, OUT = './output' // it could be 'my/newer/file/located/there'
;


gulp.src(SRC)
.pipe(thr(function(chunk, enc, next){
  chunk.contents = new Buffer('') // cleaning the contents of the file
  chunk._originalPath = chunk.path
  next(null, chunk)
}))
.pipe(gulp.dest(OUT))
.pipe(thr(function(chunk, enc, next){
  // now a place holder file exists at our destination.
  // so we can write to it and being convident it exists
  console.log('moving file from', chunk._originalPath, 'to', chunk.path)
  fs.rename(chunk._originalPath, chunk.path, function(err){
    if (err) return next(err)
    next()
  })
}))

这会将所有css,html和js文件从input移动到output,无论有多少嵌套目录

gulp真棒:)