2014-11-27 18 views
10

LƯU Ý: Hóa ra vấn đề của tôi không phải là middlware express.static(), mà là sự khác biệt giữa app.use() và app.get(). Câu hỏi này trả lời nó một cách hoàn hảo (cách tốt hơn so với các tài liệu API nhanh!):Sự khác nhau giữa app.use và app.get với express.static là gì?

Difference between app.use and app.get in express.js

Tôi hiểu sự khác biệt giữa app.use ('/') và app.get ('/') để được rằng sau này chỉ phục vụ các yêu cầu HTTP GET tới điểm cuối đó, trong khi trước đó cung cấp tất cả các yêu cầu HTTP tới điểm cuối đó.

Tôi cũng hiểu rằng phần mềm trung gian express.static phục vụ các trang tĩnh từ đường dẫn thư mục đến điểm cuối.

Những gì tôi không làm theo là tại sao điều này:

app.get('/', express.static(__dirname + '/public') 

Phục vụ chỉ trang đầu tiên được yêu cầu, và không phải bất kỳ ref = hoặc các trang liên kết src =/script tham chiếu bởi trang bạn yêu cầu. Ví dụ, đây là hai morgan dấu vết đối phó với một đơn giản trang index.html rằng có một liên kết css vào tập tin 'style.css'

1) Server yêu cầu dấu vết sử dụng app.use ('/')

Server listening on 0.0.0.0:8080 
GET/200 6.258 ms - 444 
GET /style.css 304 2.842 ms - - 

2) server yêu cầu dấu vết sử dụng app.get ('/')

Server listening on 0.0.0.0:8080 
GET/304 5.131 ms - - 
GET /style.css 404 2.990 ms - 22 

404 ???

Làm thế nào mà trình duyệt gửi yêu cầu GET đến '/', app.get ('/') không thể phục vụ css, nhưng app.use ('/') đã thành công.

Tôi thiếu chi tiết nào với app.get ('/') hoặc express.static?

Cảm ơn trước, PT

Đây là đơn giản, mã đơn giản:

app.js:

var morgan = require('morgan'), 
    express = require('express'), 
    app = express(), 
    server = require('http').Server(app); 
app.use(morgan('dev')); 

    // Uncomment .get or .use, but not both 

    // this only serves index.html, not style.css when I nav to localhost:8080/ 
    //app.get('/', express.static(__dirname + '/pub')); 

    // this serves both pages when I nav to localhost:8080/ 
    app.use('/', express.static(__dirname + '/pub')); 

server.listen(8080); 

Và đây là html ...

index.html

<!doctype html> 
<html> 
    <head> 
    <link rel="stylesheet" type="text/css" href="style.css"> 
    </head> 
</html> 

Đường dẫn:

/app.js 
/pub/index.html 
/pub/style.css 
+1

Nếu bạn có mọi thứ theo đúng thứ tự và nội dung có trong thư mục thích hợp và bạn không có lỗi, thì theo [Express documentation] (http://expressjs.com/api.html#express.static) , điều này sẽ hoạt động: 'app.use (express.static (__ dirname + '/ public'));'. Nhưng, bạn sẽ phải rất cẩn thận về thứ tự của sự vật. Đó là lý do thông thường mà nội dung tĩnh được đặt vào một đường dẫn riêng biệt để phần mềm trung gian và trình xử lý '.get()' dễ tách biệt hơn với chỉ định đường dẫn (ví dụ: máy chủ tất cả nội dung tĩnh từ đường dẫn URL của '/ lib' hoặc gì đó Như vậy, – jfriend00

+0

Điều đó liên quan đến câu hỏi như thế nào? Tôi không hiểu câu trả lời, nó hoạt động tốt với .use(). Chỉ có hai tệp trong "public /" và một endpoint, "/". t .use và .get cả hai đều trả lời cho GET của trình duyệt theo cách tương tự? Sự khác biệt là gì? – PeterT

+0

Sau đó, tôi đoán tôi không hiểu vấn đề bạn đang cố gắng giải quyết? Nó không rõ ràng với tôi URL nào bạn – jfriend00

Trả lời

6

app.get('/', handler) được "thêm/bảng định tuyến, và khi http GET yêu cầu đến xử lý cuộc gọi"

app.use(middlevare) được "thêm middlevare vào stack".

"trung gian" là một chức năng mà chấp nhận (request, response, next), middleware tiếp theo được một cách rõ ràng được gọi là bởi trước đó với tiếp theo()

express.static() trả về middleware - đặc biệt, một chức năng để kiểm tra con đường của yêu cầu và nội dung suối của một tệp tương ứng để phản hồi.Nếu bạn thêm nó bằng cách sử app.get('/')nó không bao giờ kêu gọi phi - "/" Tuyến

+1

OK. Tôi nghĩ .use và .get chỉ khác với phương pháp mà họ phản hồi, nhưng nó sâu sắc hơn nhiều, đặc biệt. về cách điểm cuối được giải quyết. Như đã trả lời ở đây: http://stackoverflow.com/questions/15601703/difference-between-app-use-and-app-get-in-express-js – PeterT

1

Câu trả lời ngắn gọn là app.use('/', express.static(__dirname + '/public')) sẽ phù hợp với bất kỳ con đường mà bắt đầu với /. Điều này có nghĩa là mọi thứ như /about/contact được bao gồm. Tuy nhiên, app.get('/', express.static(__dirname + '/public')) sẽ chỉ khớp với tuyến đường cụ thể /. Do đó, ví dụ: /about/contact sẽ không được bao gồm.

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