【问题标题】:Error: ENOENT, no such file or directory Node JS错误:ENOENT,没有这样的文件或目录 Node JS
【发布时间】:2014-09-27 00:06:28
【问题描述】:

我正在尝试通过 Node.js 将图像上传和下载到服务器,我正在使用以下代码:

var http = require('http'),
    path = require('path'),
    os = require('os'),
    fs= require('fs'),url = require('url');

var Busboy = require('busboy');

http.createServer(function(req, res) {
  if (req.method === 'POST') {
    var busboy = new Busboy({ headers: req.headers });
    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
      var saveTo = ".\\Images\\"+filename;
      file.pipe(fs.createWriteStream(saveTo));
    });
    busboy.on('finish', function() {
      res.writeHead(200, { 'Connection': 'close' });
      res.end("That's all folks!");
    });
    return req.pipe(busboy);
  }
 else{
    var request = url.parse(req.url, true);
    console.log(request);
    var action = request.pathname;
    console.log(action);
     if (action !== '/') {
         var img = fs.readFileSync('.'+action);
        res.writeHead(200, {'Content-Type': 'image/gif' });
        res.end(img, 'binary');
     } else { 
        res.writeHead(200, {'Content-Type': 'text/plain' });
        res.end('Hello World \n');
     }
  }
  res.writeHead(404);
  res.end();
}).listen(8082, function() {
  console.log('Listening for requests');
});

当我尝试在http://localhost:8082/images/betty.jpg 使用 HTTP GET 从该服务器获取图像时,请求已完成并接收到图像,但它也会引发以下错误:

             ^
fs.js:438
  return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
                 ^
Error: ENOENT, no such file or directory 'D:\ImageUploadService\favicon.ico'
    at Object.fs.openSync (fs.js:438:18)
    at Object.fs.readFileSync (fs.js:289:15)
    at Server.<anonymous> (D:\ImageUploadService\service.js:27:20)
    at Server.emit (events.js:98:17)
    at HTTPParser.parser.onIncoming (http.js:2112:12)
    at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23
)
    at Socket.socket.ondata (http.js:1970:22)
    at TCP.onread (net.js:527:27) 'D:\ImageUploadService\favicon.ico'
    at Object.fs.openSync (fs.js:438:18)
    at Object.fs.readFileSync (fs.js:289:15)
    at Server.<anonymous> (D:\ImageUploadService\service.js:27:20)
    at Server.emit (events.js:98:17)
    at HTTPParser.parser.onIncoming (http.js:2112:12)
    at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23
)
    at Socket.socket.ondata (http.js:1970:22)
    at TCP.onread (net.js:527:27)

它似乎正在寻找一些 favicon.ico。可能是什么问题?

【问题讨论】:

    标签: javascript node.js http get


    【解决方案1】:

    在尝试读取之前,您需要使用fs.existsSync(path) 检查文件是否存在:

     if (action !== '/' && fs.existsSync('.'+action)) {
        var img = fs.readFileSync('.'+action);
        res.writeHead(200, {'Content-Type': 'image/gif' });
        res.end(img, 'binary');
     } else {
    

    【讨论】:

    • 仅供参考,这在某种程度上是一种反模式,并不是一个好习惯。最好只捕获fs.readFileSync() 上的错误并安全处理 ENOENT 错误,因为这在一个多任务的世界。最好不要在核心事件处理中使用同步文件 I/O。
    • 请注意,exists 将因 jfriend00 提到的原因而被严重弃用,并且在 fs 的后续版本中不起作用。
    • 这里是 Webpack 和 Node 新手。花 2 天时间来解决这个问题。 “存在”可能会被弃用,这可能是个坏习惯,但我明天必须提供工作流程设置,我真的需要这个。谢谢。
    • 很奇怪。我个人一直认为应该尽可能避免异常处理(例如,当我们可以先检查文件是否存在时)并且只在真正意外的情况下使用异常,例如网络错误、磁盘操作失败等。
    • 后来,我写了一个更好的版本:stackoverflow.com/questions/32322107/… 这后来被扩展为 if-modifed-since 这需要在打开事件中暂停流,以便可以在之前调用 fs.fstat溪流开始流动。
    猜你喜欢
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2019-10-14
    • 1970-01-01
    • 2019-03-09
    • 2017-12-28
    • 2022-01-16
    相关资源
    最近更新 更多