2014-09-27 18 views
5

Tôi cố gắng để upoad và tải hình ảnh đến máy chủ qua Node.js và tôi đang sử dụng mã bên dưới:Lỗi: ENOENT, không có tập tin hoặc thư mục 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'); 
}); 

Khi tôi cố gắng để có được hình ảnh từ máy chủ này sử dụng HTTP GET tại http://localhost:8082/images/betty.jpg, yêu cầu được hoàn thành và hình ảnh được nhận được nhưng nó cũng ném lỗi dưới đây:

  ^
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) 

dường như nó đang tìm kiếm một số favicon.ico. Điều gì có thể là vấn đề??

Trả lời

7

Bạn cần phải kiểm tra nếu tập tin tồn tại với fs.existsSync(path) trước khi cố gắng đọc nó:

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

FYI, đây là một chút của một mô hình chống và không phải là một thói quen tốt để được Đó là tốt hơn để chỉ. bắt lỗi trên 'fs.readFileSync()' và xử lý một lỗi ENOENT một cách an toàn vì nó hoạt động tốt hơn trong một thế giới đa tác vụ. Cũng tốt hơn là không sử dụng tệp I/O đồng bộ trong xử lý sự kiện cốt lõi của bạn. – jfriend00

+1

Hãy cẩn thận, 'tồn tại' sẽ bị từ chối nghiêm trọng vì những lý do được đề cập bởi jfriend00 và sẽ không hoạt động trong các phiên bản khác của fs. –

+0

Webpack và Node newbie tại đây. Hãy dành 2 ngày để tìm ra điều này. "tồn tại" có thể bị phản đối và điều này có thể là một thói quen xấu, nhưng tôi phải cung cấp thiết lập quy trình làm việc vào ngày mai và tôi thực sự cần điều này. Cảm ơn bạn. – Larrydx

Các vấn đề liên quan