file statis dengan express.js

213

Saya ingin melayani index.htmldan /mediasubdirektori sebagai file statis. File indeks harus disajikan di /index.htmldan/ URL.

saya sudah

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

tetapi baris kedua tampaknya melayani keseluruhan __dirname, termasuk semua file di dalamnya (bukan hanya index.htmldanmedia ), yang tidak saya inginkan.

Saya juga mencoba

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

tetapi mengakses URL dasar /kemudian mengarah ke permintaan untuk web_server/index.html/index.html(dua kali lipatindex.html komponen ), yang tentu saja gagal.

Ada ide?


Ngomong-ngomong, saya sama sekali tidak menemukan dokumentasi di Express tentang topik ini ( static()+ paramsnya) ... membuat frustrasi. Tautan dokumen juga diterima.

pengguna124114
sumber
2
Pada express 4.x, express.static()ditangani oleh serve-staticpaket middleware. Anda dapat menemukan dokumennya di npmjs.com/package/serve-static atau github.com/expressjs/serve-static .
Anm
dapat seseorang tolong jelaskan apa arti "server sebagai file statis"?
Abhi
@ iLiveInAPineappleUnderTheSea Dalam aplikasi web dinamis, seperti saat menggunakan Express, konten halaman dibuat - atau dihasilkan - oleh aplikasi. Di sisi lain, file statis dilayani (sebagian besar) tidak dimodifikasi dari hierarki direktori statis. Misalnya, sementara halaman dapat berubah, file gambar, file CSS, dan file Javascript tidak.
Philip Callender
periksa tautan di bawah ini only4ututorials.blogspot.com/2017/05/...
Dexter

Jawaban:

100

express.static()mengharapkan parameter pertama menjadi jalur direktori, bukan nama file. Saya akan menyarankan membuat subdirektori lain untuk menampung Anda index.htmldan menggunakannya.

Melayani file statis di Express dokumentasi , atau dokumentasi yang lebih terperinciserve-static , termasuk perilaku default penyajianindex.html :

Secara default modul ini akan mengirim file "index.html" sebagai tanggapan atas permintaan pada direktori. Untuk menonaktifkan set ini salah atau untuk memasok indeks baru, lewati sebuah string atau array dalam urutan yang disukai.

abe
sumber
6
Dan hanya untuk informasi, itu akan melayani index.html secara default di direktori lain
TheSteve0
Jika hanya ada SATU parameter - maka express.staticdiharapkan satu parameter menjadi jalur ....
Seti
188

Jika Anda memiliki pengaturan ini

/app
   /public/index.html
   /media

Maka ini harus mendapatkan apa yang Anda inginkan

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

Caranya adalah meninggalkan garis ini sebagai fallback terakhir

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

Mengenai dokumentasi, karena Express menggunakan connect middleware, saya merasa lebih mudah untuk hanya melihat kode sumber connect secara langsung.

Misalnya baris ini menunjukkan bahwa index.html didukung https://github.com/senchalabs/connect/blob/2.3.3/lib/middleware/static.js#L140

250R
sumber
15
Application.configure()didokumentasikan sebagai warisan dalam 3.x dan dihapus pada 4.x. Lihat jawaban ChrisCantrell untuk contoh yang diperbarui.
Anm
Terima kasih, ini banyak membantu
mdegges
apa __dirname? Apa nilainya?
Abhi
1
ketinggalan jaman untuk express terbaru.
John Heeter
133

Dalam versi terbaru express, "createServer" sudah tidak digunakan lagi. Contoh ini cocok untuk saya:

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');
ChrisCantrell
sumber
__dirname adalah kata kunci?
Mohammad Faizan khan
6
Ini adalah global dalam modul nodejs Anda. nodejs.org/docs/latest/api/globals.html#globals_dirname
ChrisCantrell
7
__dirname sebenarnya bukan global tetapi lebih bersifat lokal untuk setiap modul.
Mohammad Faizan khan
2
ini setara dengan python __file__yang Anda gunakan denganos.path.dirname(os.path.realpath(__file__))
Abdelouahab
@ ChrisCantrell Bagaimana saya bisa menambahkan ke folder statis jika saya punya file public/teams/logo.png?
michal
37

res.sendFile& express.staticKeduanya akan bekerja untuk ini

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

Dimana public folder tempat kode sisi klien berada

Seperti yang disarankan oleh @ATOzTOA dan diklarifikasi oleh @Vozzie , path.joinmengambil jalur untuk bergabung sebagai argumen, argumen tersebut +dilewati satu argumen ke jalur.

Mohammed Zameer
sumber
2
path.joinmengambil path untuk bergabung sebagai argumen, +melewati satu argumen ke path.
ATOzTOA
@ATOzTOA, bisakah Anda jelaskan lebih lanjut
Mohammed Zameer
Apa yang dikatakan @ATOzTOA adalah Anda harus berubah path.join(public + 'index.html')menjadi path.join(public, 'index.html')Dan sementara itu, ubah __dirname + "/public/"menjadipath.join(__dirname, 'public')
Vozzie
Ini membantu saya dalam menggabungkan situs statis dengan API all in one
Jeff Beagley
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')
})
rajmobiapp
sumber
2

npm instal 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 );
})
Rejayi CS
sumber
2

gunakan di bawah ini di dalam app.js Anda

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

(folderName adalah folder yang memiliki file) - ingat aset ini diakses langsung melalui jalur server (yaitu http: // localhost: 3000 / abc.png (di mana seperti abc.png ada di dalam folder folderName)

Pravin
sumber