express.js içeren statik dosyalar


213

Ben hizmet etmek istiyorum index.htmlve /mediastatik dosyaları gibi alt dizin. Dizin dosyası hem servis edilmelidir /index.htmlve /URL'ler.

Sahibim

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

ancak ikinci satır __dirname, istemediğim (sadece index.htmlve değil media) içindeki tüm dosyalar da dahil olmak üzere , tüm hizmet veriyor .

Ben de denedim

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

ancak temel URL'ye erişmek, elbette başarısız olan (çift bileşen) /isteğine yol açar .web_server/index.html/index.htmlindex.html

Herhangi bir fikir?


Bu arada, Express'te bu konuyla ilgili hiçbir belge bulamamıştım ( static()+ onun parametrelerini) ... sinir bozucu. Bir doc bağlantısı da kabul edilir.


2
Express 4.x itibariyle, paket ara katman yazılımı express.static()tarafından ele alınır serve-static. dokümanlarını npmjs.com/package/serve-static veya github.com/expressjs/serve-static adresinde bulabilirsiniz .
Anm

birisi "statik dosyalar olarak sunucu" ne anlama geldiğini açıklayabilir misiniz?
Abhi

@iLiveInAPineappleUnderTheSea Express gibi bir dinamik web uygulamasında, sayfa içeriği uygulama tarafından oluşturulur veya oluşturulur. Diğer yandan, statik dosyalar statik dizin hiyerarşisinden değiştirilmeden sunulur (çoğunlukla). Örneğin, sayfalar değişebilirken, görüntü dosyaları, CSS dosyaları ve Javascript dosyaları değişmez.
Philip Callender

sadece aşağıdaki bağlantıyı kontrol edin4ututorials.blogspot.com/2017/05/…
Dexter

Yanıtlar:


100

express.static()ilk parametrenin bir dosya adı değil, bir dizin yolu olmasını bekler . Bunu içermek index.htmlve kullanmak için başka bir alt dizin oluşturmanızı öneririm .

Express belgelerinde statik dosyalar veya varsayılan sunum davranışı da dahil olmak üzere daha ayrıntılı serve-staticbelgeler sunmaindex.html :

Varsayılan olarak, bu modül bir dizindeki bir isteğe yanıt olarak “index.html” dosyaları gönderir. Bu ayarı false olarak devre dışı bırakmak veya yeni bir dizin sağlamak için bir dizeyi veya diziyi tercih edilen sırada geçirin.


6
Ve sadece bilgi için, diğer dizinde varsayılan olarak index.html'yi
sunacaktır

Sadece BİR parametre varsa - o zaman express.staticbir parametrenin yol olmasını bekler ....
Seti

188

Bu kuruluma sahipseniz

/app
   /public/index.html
   /media

O zaman bu istediğini almalı

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

Hüner bu çizgiyi son geri dönüş olarak terk ediyor

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

Belgelere gelince, Express bağlantı ara katmanı yazılımı kullandığından, sadece bağlantı kaynak koduna doğrudan bakmayı daha kolay buldum.

Örneğin, bu satır index.html dosyasının desteklendiğini gösterir https://github.com/senchalabs/connect/blob/2.3.3/lib/middleware/static.js#L140


15
Application.configure()3.x'te eski olarak belgelendi ve 4.x'te kaldırıldı. Güncellenmiş bir örnek için ChrisCantrell'ın cevabına bakınız.
Anm

Teşekkürler, bu çok yardımcı oldu
mdegges

nedir __dirname? Değeri nedir?
Abhi

1
son ekspres için modası geçmiş.
John Heeter

133

Express'in en yeni sürümünde "createServer" kullanımdan kaldırılmıştır. Bu örnek benim için çalışıyor:

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 anahtar kelime mi?
Muhammed Faizan khan


7
__dirname aslında küresel değil, her modül için yereldir.
Muhammed Faizan khan

2
Bu, python __file__ile birlikte kullandığınız eşdeğerdiros.path.dirname(os.path.realpath(__file__))
Abdelouahab

@ChrisCantrell Dosyam varsa statik klasöre nasıl ekleyebilirim public/teams/logo.png?
michal

37

res.sendFile& express.staticikisi de bunun için çalışacak

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

publicİstemci tarafı kodunun bulunduğu klasör nerede

De önerilen göre @ATOzTOA ve berraklaştırılmış @Vozzie , path.joinbağımsız değişken olarak katılması için yollar alır +yoluna tek bir argüman geçer.


2
path.joinargüman olarak birleştirilecek yolları alır, yola +tek bir argüman iletir.
ATOzTOA

@ATOzTOA daha fazla açıklayabilir misiniz lütfen
Mohammed

Ne @ATOzTOA söylediğini değiştirmek gerekir olduğunu path.join(public + 'index.html')içine path.join(public, 'index.html')bunu yaparken, değişim ve __dirname + "/public/"içinepath.join(__dirname, 'public')
Vozzie

Bu, statik bir siteyi bir API ile bir araya
getirmeme

5
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 install serve-index

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

aşağıda app.js dosyanızın içinde kullanın

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

(klasörAdı dosyaları olan klasördür) - bu varlıklara doğrudan sunucu yolu üzerinden erişildiğini unutmayın (ör. http: // localhost: 3000 / abc.png (burada abc.png klasörName klasörünün içindedir)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.