2012-05-17 27 views
6

tổng noobie Node.js, bắt đầu chơi với mã giới thiệu từ các hướng dẫn khác nhau và các trang web và tôi nhận thấy một cái gì đó mà tôi không hiểu ...Node.js app.get không được gọi

cụ thể là, nếu tôi có chỉ số .html trong thư mục công khai/của tôi, sau đó

app.get("/", function (req, res) { 
    console.log("get /"); 
    res.redirect("/test.html"); 
}); 

đơn giản là không bao giờ được gọi. Ngay sau khi tôi đổi tên index.html để index2.html sau đó phương pháp này được gọi và tôi đang chuyển hướng đến /public/test.html

đây là những gì tôi có:

var io = require('socket.io'), 
    express = require('express'), 
    MemoryStore = express.session.MemoryStore, 
    app = express.createServer(), 
    sessionStore = new MemoryStore(); 

app.configure(function() { 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(express.session({ 
     store: sessionStore, 
     secret: 'secret', 
     key: 'express.sid' 
    })); 
    app.use(express.static(__dirname + '/public')); 
}); 

và phần còn lại là khá được lấy từ hướng dẫn này: http://www.danielbaulig.de/socket-ioexpress/

Sự cố tương tự xuất hiện với bất kỳ tệp nào khác. Nếu tôi có /public/test.html, sau đó khi tôi gọi

http://localhost:8201/test.html 

app.get này không được gọi là:

app.get("/test.html", app.authenticateUser, function (req, res) { 
    console.log("get /test.html"); 
    res.redirect("/test2.html"); 
}); 

Khi tôi loại bỏ các test.html sau đó tôi nhận được chuyển tiếp đến test2. html ...

Lý do tôi đang cố gắng chuyển hướng là nếu người dùng không đăng nhập, tôi không muốn anh ta mở index.html mà muốn chuyển tiếp anh ta đến login.html, điều này là không thể nếu chỉ mục .html tồn tại. Chỉ có "giải pháp" là làm điều đó phía khách hàng mà hút, tôi không muốn index.html để tải trong trình duyệt của khách hàng chỉ để chuyển tiếp anh ta để login.html, máy chủ nên, trong oppinion của tôi, xử lý đó.

+0

lý do tại sao bạn đang sử dụng một tĩnh 'index.html' thay vì một cái nhìn? Dường như với tôi như bạn đang làm cho mọi việc trở nên khó khăn hơn. –

Trả lời

1

Đó là vì bộ lọc thể hiện yêu cầu trước khi nó được đưa vào mã của bạn. Nó tìm thấy tập tin và trả lại nó cho trình duyệt.

Giải pháp là gửi một sự kiện qua socket.io để mã trong trình duyệt của người dùng chuyển hướng hoặc di chuyển tệp vào không gian riêng tư (bên ngoài thư mục công khai) và phân phát qua "fs" như CydGy đề xuất.

0

hướng dẫn rất hay này (http://www.danielbaulig.de/socket-ioexpress/) đề cập đến ổ cắm. Và tôi nghĩ là không hữu ích cho trường hợp này.

Vì vậy, nhìn này:

app.get("/test.html", app.authenticateUser, function (req, res) { 

nhưng đâu là app.authenticateUser? nó chắc chắn là kẻ khối

Vì vậy, thay thế nó bằng cách:

app.get("/test.html", function (req, res) { 

hoặc sửa đổi app.authenticateUser của bạn.

(Và sử dụng các mô-đun fs để đọc tập tin của bạn, và sau đó, bạn có thể res.send(file);)

Đừng quên để viết .html trong url của bạn, nếu không, bạn phải thay thế "/test.html" bởi "/test")

Tôi hy vọng nó sẽ giúp bạn.

+0

http://www.danielbaulig.de/socket-ioexpress/ liên kết được đề cập trong bài đăng của tôi ... đó là hướng dẫn tôi đã sử dụng ... đối với ứng dụng.authenticateNgười dùng tôi đã xóa nó, vẫn như cũ .. –

16

Sự cố là phần mềm trung gian tệp tĩnh của bạn app.use(express.static(__dirname + '/public')) là "ở phía trước" của bộ định tuyến. Khi bạn viết

app.configure(function() { 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({ 
    store: sessionStore, 
    secret: 'secret', 
    key: 'express.sid' 
})); 
app.use(express.static(__dirname + '/public')); 
}); 

này tương đương với

app.configure(function() { 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({ 
    store: sessionStore, 
    secret: 'secret', 
    key: 'express.sid' 
})); 
app.use(express.static(__dirname + '/public')); 
app.use(app.router); //Express implicitly appends router middleware! 
}); 

vì tốc ngầm gắn thêm bộ định tuyến trung gian ở phần cuối của chồng nếu bạn không thêm nó ở đâu đó một cách rõ ràng. Bây giờ bạn thấy rõ ràng rằng phần mềm trung gian tập tin tĩnh ở phía trước router. Nếu tìm thấy tệp tĩnh, nó được phục vụ bởi app.use(express.static(__dirname + '/public')) và bộ định tuyến app.use(app.router) sẽ không bao giờ được gọi. Nếu bạn muốn yêu cầu của bạn luôn luôn đi qua bộ định tuyến, bạn nên đặt nó ở phía trước, ví dụ

app.configure(function() { 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({ 
    store: sessionStore, 
    secret: 'secret', 
    key: 'express.sid' 
})); 
app.use(app.router); //Now router comes first and will be executed before static middleware 
app.use(express.static(__dirname + '/public')); 
}); 
+0

Cảm ơn câu trả lời chi tiết, thật không may, nó không hoạt động khi tôi thêm app.use (app.router); ... –

+0

giải thích tuyệt vời ..... – Nav

+0

Phản hồi tuyệt vời. –

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