0

我正在尝试在 Intel Edison 上使用 NodeJs 构建一些东西。我正在使用插件:https ://github.com/blueimp/jQuery-File-Upload和 NodeJS 服务器端部分。

但是,我不断得到

fs.js:543
  return binding.rename(pathModule._makeLong(oldPath),
                 ^
Error: ENOENT, no such file or directory '/home/root/db/node_modules/blueimp-file-upload-node/tmp/8fa2946958c04ad8cb6def7b1e9dab01'
    at Object.fs.renameSync (fs.js:543:18)
    at IncomingForm.<anonymous> (/home/root/db/node_modules/blueimp-file-upload-node/server.js:248:16)
    at IncomingForm.EventEmitter.emit (events.js:98:17)
    at /home/root/db/node_modules/blueimp-file-upload-node/node_modules/formidable/lib/incoming_form.js:228:12
    at WriteStream.<anonymous> (/home/root/db/node_modules/blueimp-file-upload-node/node_modules/formidable/lib/file.js:70:5)
    at WriteStream.g (events.js:180:16)
    at WriteStream.EventEmitter.emit (events.js:117:20)
    at finishMaybe (_stream_writable.js:360:12)
    at afterWrite (_stream_writable.js:280:5)
    at onwrite (_stream_writable.js:270:7)

每当我尝试上传某些东西时。问题是该文件/home/root/db/node_modules/blueimp-file-upload-node/tmp/8fa2946958c04ad8cb6def7b1e9dab01确实存在,我我也拥有该文件夹中的权限。

我尝试了几件事,但我真的被困在这里,我无法理解如何解决这个问题。

4

1 回答 1

0

错误之后,文件是旧名称还是新名称?(我遇到过两个线程被无意启动的情况,第二个发现文件已经消失了)。目标目录是否存在?有错别字吗?

这是 linux 手册页关于重命名的内容:

ENOENT oldpath 命名的链接不存在;或者,新路径中的目录组件不存在;或者,oldpath 或 newpath 是一个空字符串。

编辑:这是一个nodejs错误,它报告源文件丢失,而实际上是问题所在的目标目录。从命令行重现:

% touch /tmp/file.txt
% node -p 'fs = require("fs"); fs.renameSync("/tmp/file.txt", "/nonesuch/file.txt");'

它打印:

Error: ENOENT, no such file or directory '/tmp/file.txt'
    at Object.fs.renameSync (fs.js:548:18)
    at [eval]:1:24
    at Object.<anonymous> ([eval]-wrapper:6:22)
    at Module._compile (module.js:456:26)
    at evalScript (node.js:536:25)
    at startup (node.js:80:7)
    at node.js:906:3

编辑:这是包装 renameSync() 以解决此问题的一种可能方法(未经测试!)

var _origRename = fs.renameSync;
fs.renameSync = function(from, to) {
    try { _origRename(from, to) }
    catch (err) {
        if (err.stack.indexOf('ENOENT') < 0) throw err;
        try { fs.statSync(from) } catch (err2) { throw err }
        throw new Error("ENOENT, no such file or directory '" + to "'");
    }
}
于 2014-11-30T05:59:16.337 回答