2014-01-12 68 views
4

我一直在玩一本关于Node.js的书中找到的代码。这是一个简单的应用程序,上传图像。Node.js EXDEV重命名错误

它显示EXDEV错误(500错误:EXDEV,重命名)。

有人能给我一个提示吗?这是我的代码:

exports.submit = function(dir) { 
    return function(req, res, next) { 
     var img = req.files.photo.image; 
     var name = req.body.photo.name || img.name; 
     var path = join(dir, img.name); 

     fs.rename(img.path, path, function (err) { 
      if(err) return next(err); 

      Photo.create({ 
       name: name, 
       path: img.name 
      }, function (err) { 
       if(err) return next(err); 
       res.redirect('/'); 
      }); 
     }); 
    }; 
}; 

回答

18

重命名文件不能跨设备完成。我的猜测是,您的上传目录(默认为/tmp)在另一个分区/驱动器上作为目标目录(包含在dir变量中)。

一些解决方案:

  • 配置上传目录是同一个分区/驱动器作为目标目录上;这取决于您使用哪个模块来处理文件上传,express.bodyParser(及其使用的模块,connect.multipart)接受您可以使用的uploadDir选项;
  • 在开始Node应用程序之前,请将TMPDIR环境变量设置为指向与目标目录相同分区/驱动器上的临时目录。如果您使用的是类Unix操作系统:

    env TMPDIR=/path/to/directory node app.js 
    
  • ,而不是从你的shell设置环境变量,在您的节点应用程序顶部设置:

    process.env.TMPDIR = '/path/to/directory'; 
    
  • ,而不是重命名,使用mv这样的模块即可以工作跨设备;
+0

它能够更好地使用shell,那么你的路径是不是源。好的密码策略等。 – chovy

1

使用Windows XP,我加入到app.js:

process.env.TMPDIR = '.'; //new 
+1

更清洁的解决方案是使用'npm mv'模块而不是'fs.rename()'。请参阅“https:// www.npmjs.com/package/mv”。 –