Node.js EXDEV 重命名错误

4

我在一本关于Node.js的书中找到了一些代码并进行实验。这是一个上传图片的简单应用程序。

它显示了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('/');
            });
        });
    };
};
2个回答

21
重命名文件不能跨设备进行。我猜测你的上传目录(默认为/tmp)与你的目标目录(在dir变量中)所在的分区/驱动器不同。
一些解决方案:
  • 配置上传目录与目标目录位于同一分区/驱动器上,这取决于你使用哪个模块来处理文件上传,express.bodyParser(及其使用的模块connect.multipart)接受一个uploadDir选项供你使用;
  • 在启动Node应用程序之前,将TMPDIR环境变量设置为指向与目标目录位于同一分区/驱动器上的临时目录。如果你正在使用Unix类型的操作系统:

env TMPDIR=/path/to/directory node app.js
  • 不要在命令行中设置环境变量,而是在你的 Node 应用程序顶部设置它:

  • process.env.TMPDIR = '/path/to/directory';
    
  • 不要重命名,而是使用像mv这样的模块,它可以在不同设备上工作;

  • 最好使用Shell,这样你的路径就不会出现在源代码中。对于密码等敏感信息来说是一个很好的策略。 - chovy

    1
    使用Windows XP,我在app.js中添加了以下内容:
    process.env.TMPDIR = '.';  //new
    

    1
    一个更加简洁的解决方案是使用 npm mv 模块而不是 fs.rename()。请参阅 https://www.npmjs.com/package/mv - Mark Tyers

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接