tệp tĩnh với express.js


212

Tôi muốn phục vụ index.html/mediathư mục con dưới dạng tệp tĩnh. Tệp chỉ mục phải được phục vụ cả tại /index.html/URL.

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 phục vụ toàn bộ __dirname, bao gồm tất cả các tệp trong đó (không chỉ index.htmlmedia), mà tôi không muốn.

Tôi cũng đã thử

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

nhưng việc truy cập URL cơ sở /sau đó dẫn đến một yêu cầu web_server/index.html/index.html( index.htmlthành phần kép ), tất nhiên không thành công.

Có ý kiến ​​gì không?


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


2
Kể từ express 4.x, express.static()được xử lý bởi serve-staticgói phần mềm trung gian. bạn có thể tìm thấy tài liệu của nó tại npmjs.com/package/serve-static hoặc github.com/expressjs/serve-static .
Anm

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

@iLiveInAPinnutUnderTheSea 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 - hoặc tạo - bởi ứng dụng. Mặt khác, các tệp tĩnh được phục vụ (hầu hết) không được sửa đổi 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à tệp Javascript thì không.
Philip Callender

kiểm tra liên kết bên dưới only4ututorials.blogspot.com/2017/05/ Quảng cáo
Dexter

Câu trả lời:


100

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

Phục vụ các tệp tĩnh trong tài liệu Express hoặc tài liệu chi tiết hơnserve-static , bao gồm cả hành vi phục vụ mặc địnhindex.html :

Theo mặc định, mô-đun này sẽ gửi các tệp tin index.html.html. Để vô hiệu hóa bộ này sai hoặc cung cấp một chỉ mục mới, hãy truyền một chuỗi hoặc một mảng theo thứ tự ưu tiên.


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

Nếu chỉ có MỘT tham số - thì hãy express.statichy vọng rằng một tham số sẽ là đường dẫn ....
Seti

188

Nếu bạn có thiết lập này

/app
   /public/index.html
   /media

Sau đó, điều này sẽ nhận đượ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à rời khỏi dòng này như dự phòng cuối cùng

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

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

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


15
Application.configure()đã được ghi nhận là di sản trong 3.x và bị xóa trong 4.x. Xem câu trả lời của ChrisCantrell cho một ví dụ cập nhật.
Anm

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

là gì __dirname? Giá trị của nó là gì?
Abhi

1
lỗi thời cho thể hiện mới nhất.
John Heeter

132

Trong phiên bản mới nhất của express, "createdServer" không được dùng nữa. Ví dụ này hoạt động với 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');

__dirname là từ khóa?
Mohammad Faizan khan

6
Nó là một toàn cầu trong mô-đun nodejs của bạn. 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 mỗi mô-đun.
Mohammad Faizan khan

2
đây là tương đương với trăn __file__mà bạn sử dụng vớios.path.dirname(os.path.realpath(__file__))
Abdelouahab

@ChrisCantrell Làm cách nào tôi có thể thêm vào thư mục tĩnh nếu tôi có tệp trong public/teams/logo.png?
michal

37

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

var express = require('express');
var app = express();
var path = require('path');
var public = path.join(__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 publiclà thư mục chứa mã phía máy khách

Như gợi ý bởi @ATOzTOAlàm sáng tỏ bởi @Vozzie , path.joinmất các đường dẫn để tham gia như các đối số, các +vượt qua một đối số duy nhất để con đường.


2
path.joinlấy các đường dẫn để tham gia làm đối số, +chuyển một đối số thành đường dẫn.
ATOzTOA

@ATOzTOA bạn có thể giải thích thêm xin vui lòng
Mohammed Zameer

Những gì @ATOzTOA đang nói là bạn nên đổi path.join(public + 'index.html')thành path.join(public, 'index.html')Và trong khi đó, hãy đổi __dirname + "/public/"thànhpath.join(__dirname, 'public')
Vozzie

Điều này giúp tôi kết hợp một trang web tĩnh với API tất cả trong một
Jeff Beagley 27/12/18

4
const path = require('path');

const express = require('express');

const app = new express();
app.use(express.static('/media'));

app.get('/', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'media/page/', 'index.html'));
});

app.listen(4000, () => {
    console.log('App listening on port 4000')
})

2

npm cài đặt chỉ mục phục vụ

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 );
})

2

sử dụng bên dưới trong app.js của bạn

app.use(express.static('folderName'));

(thư mụcName là thư mục có tệp) - hãy nhớ những tài sản này được truy cập trực tiếp qua đường dẫn máy chủ (tức là http: // localhost: 3000 / abc.png (trong đó abc.png nằm trong thư mục thư mục)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.