Express-js tidak bisa MENDAPATKAN file statis saya, mengapa?

308

Saya telah mengurangi kode saya ke aplikasi express-js paling sederhana yang dapat saya buat:

var express = require("express"),
    app = express.createServer();
app.use(express.static(__dirname + '/styles'));
app.listen(3001);

Direktori saya terlihat seperti ini:

static_file.js
/styles
  default.css

Namun ketika saya mengakses http://localhost:3001/styles/default.csssaya mendapatkan kesalahan berikut:

Cannot GET / styles /
default.css

Saya menggunakan express 2.3.3dan node 0.4.7. Apa yang saya lakukan salah?

Kit Sunde
sumber
periksa tautan di bawah ini only4ututorials.blogspot.com/2017/05/…
Dexter

Jawaban:

492

Coba http://localhost:3001/default.css.

Untuk memiliki /stylesURL permintaan Anda, gunakan:

app.use("/styles", express.static(__dirname + '/styles'));

Lihatlah contoh-contoh di halaman ini :

//Serve static content for the app from the "public" directory in the application directory.

    // GET /style.css etc
    app.use(express.static(__dirname + '/public'));

// Mount the middleware at "/static" to serve static content only when their request path is prefixed with "/static".

    // GET /static/style.css etc.
    app.use('/static', express.static(__dirname + '/public'));
Giacomo
sumber
42
Terima kasih. Sebagai seseorang yang baru mengenal Node dan Express, dokumentasi Express nampak samar hingga Anda menemukan bahwa Connect adalah tempat dokumen middleware berada.
Nate
4
Ya. Itu adalah tebasan yang hilang dalam kasus saya.
borisdiakur
Dalam kasus saya, saya tidak menyadari jalur mount dimasukkan dalam jalur seperti yang Anda jelaskan dalam contoh kedua. Terima kasih!
Mike Cheel
Dalam hal pemasangan baru Anda harus memverifikasi bahwa modul kilat Anda dipasang dengan benar ( expressjs.com/en/starter/installing.html ) maka Anda harus memeriksa lintasan dan nama direktori Anda seperti kata Giacomo;)
Spl2nky
selalu gunakan path.joinuntuk mengatasi masalah pemisah direktori lintas platform. path.join (__ dirname, '/')
Doug Chamberlain
35

Saya memiliki masalah yang sama. Saya telah menyelesaikan masalah dengan kode berikut:

app.use('/img',express.static(path.join(__dirname, 'public/images')));
app.use('/js',express.static(path.join(__dirname, 'public/javascripts')));
app.use('/css',express.static(path.join(__dirname, 'public/stylesheets')));

Contoh permintaan statis:

http://pruebaexpress.lite.c9.io/js/socket.io.js

Saya butuh solusi yang lebih sederhana. Apakah itu ada

David Miró
sumber
Terima kasih telah membagikan solusi Anda terlepas dari apakah itu optimal atau tidak. Jika Anda ingin membuka kembali masalah untuk optimisasi, pertimbangkan memposting pertanyaan baru yang merinci keadaan baru. Jika optimisasi adalah satu-satunya tujuan, pertanyaan mungkin lebih cocok untuk Tinjauan Kode SO .
15

default.css harus tersedia di http://localhost:3001/default.css

The stylesdalam app.use(express.static(__dirname + '/styles'));hanya memberitahu mengungkapkan untuk melihat di stylesdirektori untuk file statis untuk melayani. Itu tidak (membingungkan) kemudian membentuk bagian dari jalan yang tersedia.

diff_sky
sumber
3
Sama sekali! Yang oleh konvensi di express.js Anda melakukannya pada /publicyang memiliki css, js, imgfolder sehingga Anda dapat http://localhost:3001/css/default.css:)
Kit Sunde
15

Ini bekerja untuk saya:

app.use('*/css',express.static('public/css'));
app.use('*/js',express.static('public/js'));
app.use('*/images',express.static('public/images'));
pengguna3418903
sumber
9

Di server.js Anda:

var express   =     require("express");
var app       =     express();
app.use(express.static(__dirname + '/public'));

Anda telah menyatakan express dan aplikasi secara terpisah, membuat folder bernama 'publik' atau sesuka Anda, namun Anda dapat mengakses folder ini. Di template src Anda, Anda telah menambahkan jalur relatif dari / publik (atau nama folder Anda ke file statis). Waspadalah terhadap bar di rute.

Baurin Leza
sumber
6

Apa yang berhasil untuk saya adalah:

Alih-alih menulis app.use(express.static(__dirname + 'public/images'));di app.js Anda

Cukup tulis app.use(express.static('public/images'));

yaitu menghapus nama direktori root di path. Dan kemudian Anda dapat menggunakan jalur statis secara efektif di file js lainnya, Misalnya:

<img src="/images/misc/background.jpg">

Semoga ini membantu :)

Amir Aslam
sumber
Ini menyelesaikan masalah saya. Dalam kode saya, path ke CSS berfungsi dengan baik bahkan dengan gabungan __dirname (menggunakan path.join), sementara mengambil js gagal.
Chim
Saya senang bisa membantu :)
Amir Aslam
5

Saya menggunakan Bootstrap CSS, JS dan Font di aplikasi saya. Saya membuat folder bernama assetdirektori root aplikasi dan meletakkan semua folder ini di dalamnya. Kemudian dalam file server ditambahkan baris berikut:

app.use("/asset",express.static("asset"));

Baris ini memungkinkan saya untuk memuat file-file yang berada di assetdirektori dari /assetawalan jalan seperti: http://localhost:3000/asset/css/bootstrap.min.css.

Sekarang dalam pandangan saya cukup memasukkan CSS dan JS seperti di bawah ini:

<link href="/asset/css/bootstrap.min.css" rel="stylesheet">
arsho
sumber
5

untuk menyajikan file statis (file css, gambar, file js) hanya dua langkah:

  1. meneruskan direktori file css ke middleware express.static

    var express = require('express');
    var app = express();
    /*public is folder in my project directory contains three folders
    css,image,js
    */
    //css  =>folder contains css file
    //image=>folder contains images
    //js   =>folder contains javascript files
    app.use(express.static( 'public/css'));
  2. untuk mengakses file atau gambar css cukup ketik url http: // localhost: port / filename.css mis: http: // localhost: 8081 / bootstrap.css

catatan: untuk menautkan file css ke html ketikkan saja<link href="file_name.css" rel="stylesheet">

jika saya menulis kode ini

var express = require('express');
var app = express();
app.use('/css',express.static( 'public/css'));

untuk mengakses file statis cukup ketik url: localhost: port / css / filename.css mis: http: // localhost: 8081 / css / bootstrap.css

catatan untuk menautkan file css dengan html cukup tambahkan baris berikut

<link href="css/file_name.css" rel="stylesheet">    
Ahmed Mahmoud
sumber
3

ini bekerja untuk saya

app.use(express.static(path.join(__dirname, 'public')));

app.use('/img',express.static(path.join(__dirname, 'public/images')));

app.use('/shopping-cart/javascripts',express.static(path.join(__dirname, 'public/javascripts')));

app.use('/shopping-cart/stylesheets',express.static(path.join(__dirname, 'public/stylesheets')));

app.use('/user/stylesheets',express.static(path.join(__dirname, 'public/stylesheets')));

app.use('/user/javascripts',express.static(path.join(__dirname, 'public/javascripts')));
james gicharu
sumber
1

Coba akses dengan http: // localhost: 3001 / default.css .

   app.use(express.static(__dirname + '/styles'));

Anda benar-benar memberinya nama folder yaitu gaya bukan pinggiran kota Anda.

Sunil Lulla
sumber
1

Saya menemukan file css saya dan menambahkan rute ke sana:

app.get('/css/MyCSS.css', function(req, res){
  res.sendFile(__dirname + '/public/css/MyCSS.css');
});

Maka tampaknya berhasil.

Bren
sumber
Saya tidak akan merekomendasikan pendekatan ini karena Anda harus menggunakan ExpressJS .use()dan express.static()metode untuk mengirim ke mana Anda melayani file Anda. Kalau tidak, Anda akan memiliki salah satu router ini per file di direktori publik Anda dan itu banyak overhead untuk dipelihara.
Sgnl
Ini adalah pekerjaan di sekitar tetapi saya pikir itu tidak tepat. Jika Anda memiliki banyak file CSS dan JS, bagaimana Anda bisa mempertahankannya?
arsho
0

Selain di atas, pastikan path file statis dimulai dengan / (ex ... / assets / css) ... untuk menyajikan file statis di direktori mana pun di atas direktori utama (/ main)

bigskier91
sumber
2
Selain apa di atas? Nyatakan dalam jawaban Anda (berikan kredit kepada orang yang mempostingnya, jika Anda harus). SO sering mengubah urutan jawaban sehingga semua jawaban terlihat dan bukan yang pertama. Kami tidak tahu apa yang Anda bicarakan.
Zachary Kniebel
0

jika pengaturan Anda

myApp
  |
  |__ public
  |     |
  |     |__  stylesheets
  |     |     |
  |     |     |__ style.css
  |     |
  |     |___ img
  |           |
  |           |__ logo.png
  |
  |__ app.js

lalu,
masukkan app.js

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

dan lihat style.css Anda: (dalam beberapa file .pug):

link(rel='stylesheet', href='/static/stylesheets/style.css')
Bar Horing
sumber
Mengapa Anda memperkenalkan langkah penggantian nama publik -> statis? Saya akan mengatakan itu hanya informasi tambahan yang lebih membingungkan. Tapi sekali lagi tipuan biasanya hal yang baik ...
masterxilo
0
  1. Buat folder dengan nama 'publik' di
    folder proyek Nodejs .
  2. Masukkan file index.html ke dalam folder proyek Nodejs.
  3. Masukkan semua skrip dan file css ke folder publik.
  4. Menggunakan app.use( express.static('public'));

  5. dan di index.html jalur yang benar dari skrip ke<script type="text/javascript" src="/javasrc/example.js"></script>

Dan sekarang semuanya bekerja dengan baik.

Hossein Mourdzadeh
sumber
0

direktori statis

periksa gambar di atas (direktori statis) untuk struktur dir

const publicDirectoryPath = path.join(__dirname,'../public')
app.use(express.static(publicDirectoryPath))


//  or

app.use("/", express.static(publicDirectoryPath))
app.use((req, res, next) => {
res.sendFile(path.join(publicDirectoryPath,'index.html'))
halo
sumber