错误:ENOENT,没有这样的文件或目录 Node JS

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

我正在尝试通过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 GET从该服务器获取图像,地址为http://localhost:8082/images/betty.jpg时,请求被满足并成功接收到图像,但同时还会抛出以下错误:
             ^
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,可能出了什么问题?
1个回答

8

在尝试读取文件之前,您需要使用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 {

5
FYI,这有点反模式,不是一个好习惯。最好只是在“fs.readFileSync()”上捕获错误并安全地处理ENOENT错误,因为这在多任务世界中更有效。在核心事件处理中最好也不要使用同步文件I / O。 - jfriend00
1
请注意,exists将因jfriend00提到的原因被严重弃用,并且在fs的后续版本中将无法使用。 - Zachary Dahan
我是一个Webpack和Node的新手。花了两天时间来尝试解决这个问题。"exists"可能会被弃用,这可能是一个不好的习惯,但我必须在明天交付工作流程设置,并且我真的需要它。谢谢。 - larrydalmeida
有点奇怪。我个人认为,应该尽可能避免异常处理(例如在这里,当我们可以先检查文件是否存在时),只有在真正意外的情况下才使用异常处理,比如网络错误、磁盘操作失败等。 - Benjamin Piette
后来,我写了一个更好的版本:https://stackoverflow.com/questions/32322107/why-isnt-my-nodejs-web-server-fetching-files-from-my-directory/32322577#32322577。这个版本后来被扩展为支持if-modified-since,需要在打开事件中暂停流,以便在流开始流动之前调用`fs.fstat`。 - Dan D.

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