2012-05-03 31 views
153

Tôi muốn phục vụ index.html/media thư mục con dưới dạng tệp tĩnh. Tệp chỉ mục phải được phân phát ở cả hai URL /index.html/.tệp tĩnh với express.js

Tôi có

web_server.use("/media", express.static(__dirname + '/media')); 
web_server.use("/", express.static(__dirname)); 

nhưng dòng thứ hai rõ ràng là phục vụ toàn bộ __dirname, bao gồm tất cả các file trong đó (không chỉ index.htmlmedia), mà tôi không muốn.

Tôi cũng đã cố gắng

web_server.use("/", express.static(__dirname + '/index.html')); 

nhưng truy cập vào URL cơ sở / sau đó dẫn đến một yêu cầu để web_server/index.html/index.html (double index.html thành phần), trong đó tất nhiên thất bại.

Bất kỳ ý tưởng nào?


Bằng cách này, tôi có thể tìm thấy hoàn toàn không có tài liệu trong Express trên chủ đề này (static() + params của nó) ... bực bội. Một liên kết doc cũng được chào đón.

+1

Theo tốc độ 4.x, 'express.static()' được xử lý bởi phần mềm trung gian gói 'serve-static'. bạn có thể tìm tài liệu tại https://www.npmjs.com/package/serve-static hoặc https://github.com/expressjs/serve-static. – Anm

+0

ai đó có thể giải thích "máy chủ dưới dạng tệp tĩnh" nghĩa là gì? – Abhi

+0

@iLiveInAPineappleUnderTheSea Trong một ứng dụng web động, chẳng hạn như khi sử dụng Express, nội dung trang được tạo ra - hoặc được tạo ra - bởi ứng dụng. Mặt khác, các tệp tĩnh được phân phát (chủ yếu) chưa được sửa đổi từ một hệ thống phân cấp thư mục tĩnh. Ví dụ, trong khi các trang có thể thay đổi, các tệp hình ảnh, tệp CSS và các tệp Javascript thì không. –

Trả lời

66

express.static() hy vọng thông số đầu tiên là đường dẫn , không phải tên tệp. Tôi sẽ đề nghị tạo một thư mục con khác để chứa index.html của bạn và sử dụng nó.

Cung cấp tệp tĩnh trong Express documentation.

+2

Và chỉ để biết thông tin, nó sẽ phân phối index.html theo mặc định trong thư mục khác – TheSteve0

+0

Nếu chỉ có MỘT tham số - thì 'express.static' hy vọng rằng một tham số là đường dẫn .... – Seti

158

Nếu bạn đã thiết lập này

/app 
    /public/index.html 
    /media 

Sau đó, điều này sẽ có được những gì bạn muốn

var express = require('express'); 
//var server = express.createServer(); 
// express.createServer() is deprecated. 
var server = express(); // better instead 
server.configure(function(){ 
    server.use('/media', express.static(__dirname + '/media')); 
    server.use(express.static(__dirname + '/public')); 
}); 

server.listen(3000); 

Bí quyết là để lại dòng này như dự phòng cuối cùng

server.use(express.static(__dirname + '/public')); 

Đối với tài liệu hướng dẫn, vì Express sử dụng phần mềm trung gian kết nối, tôi thấy dễ dàng hơn khi chỉ xem trực tiếp mã nguồn kết nối.

Ví dụ dòng này cho thấy rằng index.html được hỗ trợ https://github.com/senchalabs/connect/blob/2.3.3/lib/middleware/static.js#L140

+7

' Application.configure() 'được ghi nhận là thừa kế trong 3.x và bị loại bỏ trong 4. x. Xem câu trả lời của ChrisCantrell cho một ví dụ được cập nhật. – Anm

+0

Cảm ơn, điều này đã giúp rất nhiều – mdegges

+0

'__dirname' là gì? Whats giá trị của nó? – Abhi

102

Trong phiên bản mới nhất của diễn tả "createServer" bị phản đối.Ví dụ này làm việc cho tôi:

var express = require('express'); 
var app = express(); 
var path = require('path'); 

//app.use(express.static(__dirname)); // Current directory is root 
app.use(express.static(path.join(__dirname, 'public'))); // "public" off of current is root 

app.listen(80); 
console.log('Listening on port 80'); 
+0

__dirname là từ khóa? –

+5

Đây là mô-đun toàn cầu trong mô-đun nút của bạn. http://nodejs.org/docs/latest/api/globals.html#globals_dirname – ChrisCantrell

+7

__dirname không thực sự là toàn cầu mà là cục bộ cho từng mô-đun. –

12

res.sendFile & express.static cả hai sẽ làm việc cho điều này

var express = require('express'); 
var app = express(); 
var path = require('path'); 
var public = __dirname + "/public/"; 

// viewed at http://localhost:8080 
app.get('/', function(req, res) { 
    res.sendFile(path.join(public + "index.html")); 
}); 

app.use('/', express.static(public)); 

app.listen(8080); 

đâu public là thư mục trong đó mã phía khách hàng là

0

NPM cài đặt serve- chỉ số

var express = require('express') 
var serveIndex = require('serve-index') 
var path = require('path') 
var serveStatic = require('serve-static') 
var app = express() 
var port = process.env.PORT || 3000; 
/**for files */ 
app.use(serveStatic(path.join(__dirname, 'public'))); 
/**for directory */ 
app.use('/', express.static('public'), serveIndex('public', {'icons': true})) 

// Listen 
app.listen(port, function() { 
    console.log('listening on port:',+ port); 
}) 
Các vấn đề liên quan