2014-10-01 23 views
9

Tôi có tập tin địa điểm sau:Làm cách nào để phân phối tệp tĩnh thông qua Node.js cục bộ?

file:///Users/MyName/Developer/sitename/scripts (contains all .js files..) 
file:///Users/MyName/Developer/sitename/css (contains all .css files..) 
file:///Users/MyName/Developer/sitename/images (contains all .jpg/png/etc. files..) 
file:///Users/MyName/Developer/sitename/sitename.html 
file:///Users/MyName/Developer/sitename/server.js 

Bên sitename.html tôi tải tất cả các file cần thiết như sau ví dụ:

<html> 
    <head> 
    <script src="scripts/somefile.js"></script> 
    </head> 
    ... 
</html> 

Vì vậy, bất cứ khi nào tôi mở ra file:///Users/MyName/Developer/sitename/sitename.html tất cả mọi thứ hoạt động tốt.

Tuy nhiên, bất cứ khi nào tôi cố gắng để tải file:///Users/MyName/Developer/sitename/sitename.html qua một máy chủ Node.js địa phương mà tôi đã thiết lập (file máy chủ vị trí: file:///Users/MyName/Developer/sitename/server.js) như sau:

var http = require("http"); 
var fs = require("fs"); 

fs.readFile('./sitename.html', function (err, html) 
{ 
    if (err) throw err; 

    http.createServer(function (request,response) 
    { 
     // serve site 
     if (request.url === "/") 
     { 
      response.writeHeader(200, {"Content-Type": "text/html"}); 
      response.write(html); 
     } 
     response.end(); 
    }).listen(8080); 
}); 

sitename.html được tìm thấy và tải nhưng tất cả các khác các tệp được cho là tải thông qua nó không tải được vì tất cả chúng đều có tiền tố http://localhost:8080/ (http://localhost:8080/scripts/somefile.js không phải là đường dẫn tệp hợp lệ). Có vẻ như ngay sau khi máy chủ được tạo ra (bên trong http.createServer(.....);) thay đổi ngữ cảnh và thư mục mẹ bây giờ trở thành http://localhost:8080/ thay vì file:///Users/MyName/Developer/sitename/, điều này có ý nghĩa nhưng không hữu ích khi sử dụng các tệp vẫn được lưu trữ cục bộ.

Làm cách nào để giải quyết vấn đề này? Thực tế là tôi đang lưu trữ server.js (chỉ trong thời gian này) trong cùng một thư mục làm cho mọi việc trở nên khó hiểu hơn?

Cảm ơn!

Trả lời

8

Bạn có thể tải các tệp bằng cách sử dụng URL file:// vì đó là một tính năng của trình duyệt web của bạn.

Khi tải địa chỉ http://localhost:8080 bạn không còn tận dụng khả năng của trình duyệt để phân phát tệp (bạn đang truy cập máy chủ Node.js). Trang HTML đang được phân phát chứa các đường dẫn tương đối hoạt động cùng với tên máy chủ hiện tại để tải nội dung.

Có vô số tùy chọn để phân phối nội dung.

Bạn có thể phục vụ các tập tin với Node.js:

Ngoài bạn có thể sử dụng máy chủ web để phân phát các tệp cho bạn. Đây có thể là lựa chọn hiệu quả nhất. Here is an example phục vụ nội dung tĩnh với nginx.

+0

Xin cảm ơn rất nhiều vì đã trả lời của bạn. Tôi sẽ xem xét 2 tùy chọn bạn đã đề xuất. Nhưng chỉ vì tôi mới làm điều này, bạn có thể vui lòng xây dựng thêm một chút không: Vì vậy, bất cứ khi nào ai đó xây dựng một ứng dụng web và sử dụng Node.js để phục vụ ứng dụng và ứng dụng có nhiều tệp tĩnh (hiển nhiên), điều đó có nghĩa là họ luôn cần sử dụng "plugin" giống như plugin bạn đã đề xuất khi thử nghiệm ứng dụng của họ tại địa phương? Có vẻ hơi lạ một chút, Node không có tùy chọn mặc định để chỉ định vị trí thư mục mẹ cho tất cả các tệp tĩnh sẽ được phân phát.? Cảm ơn một lần nữa vì sự giúp đỡ của bạn! –

+1

Node cung cấp cho bạn các công cụ để phục vụ các tệp đó, bạn chỉ cần thực hiện nó. Đó là lý do tại sao rất nhiều mô-đun tồn tại, bởi vì chức năng chỉ không đi ra khỏi hộp. Bạn chắc chắn có thể phục vụ tệp với Node.js nhưng bạn sẽ phải triển khai một tuyến đường trong máy chủ của bạn nhận ra yêu cầu cho "/style.css" và đọc tệp đó từ đĩa. –

+0

Cảm ơn rất nhiều vì đã làm rõ rằng Jeff –

3

Vấn đề là khi bạn đã xác định đường dẫn cho một tài nguyên tĩnh (sitename.html), bạn chưa xác định đường dẫn cho tất cả các tài nguyên tĩnh khác mà nó tham chiếu (ví dụ: somefile.js). Giả sử cấu trúc tệp sau, bên dưới chứa mã máy chủ xử lý các tài nguyên tĩnh tải liên quan đến thư mục công cộng của bạn (www), mà không sử dụng các mô-đun bên ngoài. (được lấy một phần từ here)

project/ 
    server/  
     server.js 
     dispatcher.js 
    www/ 
     index.html 
     js/ (your javascript files) 
     css/ (your css files) 

máy chủ.js:

var http = require('http'); 
http.createServer(handleRequest).listen(8124, "127.0.0.1"); 
var dispatcher = require('./dispatcher.js'); 

function handleRequest(req, res) { 
    try { 
     console.log(req.url); 
     dispatcher.dispatch(req, res); 
    } catch(err) { 
     console.log(err); 
    } 
} 

dispatcher.js:

var fs = require('fs'); 
var path = require('path'); 

this.dispatch = function(request, response) { 
    //set the base path so files are served relative to index.html 
    var basePath = "../www"; 
    var filePath = basePath + request.url; 

    var contentType = 'text/html'; 
    var extname = path.extname('filePath'); 
    //get right Content-Type 
    switch (extname) { 
     case '.js': 
      contentType = 'text/javascript'; 
      break; 
     case '.css': 
      contentType = 'text/css'; 
      break; 
    } 

    //default to index.html 
    if (filePath == basePath + "/") { 
     filePath = filePath + "index.html"; 
    } 

    //Write the file to response 
    fs.readFile(filePath, function(error, content) { 
     if (error) { 
      response.writeHead(500); 
      response.end(); 
     } else { 
      response.writeHead(200, {'Content-Type': contentType}); 
      response.end(content, 'utf-8'); 
     } 
    }); 

} 
9

Giải pháp đơn giản nhất tôi tìm thấy trên phục vụ các tập tin tĩnh địa phương là sử dụng Http-Server.

Cách sử dụng của nó đã chết đơn giản. Sau khi cài đặt nó trên toàn cầu

npm install http-server -g 

Đến thư mục gốc bạn muốn phục vụ

cd <dir> 
http-server 

Vậy là xong!

+0

Điều này làm việc hoàn hảo cho tôi và tôi tin là giải pháp chính xác mà OP đang tìm kiếm! Cảm ơn bạn @hexinpeter –

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