Menyiapkan dua direktori statis berbeda dalam kerangka kerja node.js Express


101

Apa itu mungkin? Saya ingin menyiapkan dua direktori berbeda untuk melayani file statis. Misalnya / public dan / mnt


2
Halaman ini sepertinya mengatakan bahwa itu mungkin tetapi tidak menjelaskan lebih detail dari itu.
daun bawang

Jawaban:


152

Anda juga dapat menyetel jalur tempat file statis akan disajikan ke web dari dengan menentukan parameter tambahan (pertama) untuk use()menyukainya:

app.use("/public", express.static(__dirname + "/public"));
app.use("/public2", express.static(__dirname + "/public2"));

Dengan begitu Anda mendapatkan dua direktori berbeda di web yang mencerminkan direktori lokal Anda, bukan satu jalur url yang gagal di antara dua direktori lokal.

Dengan kata lain pola URL:

http://your.server.com/public/*

Melayani file dari direktori lokal publicsementara:

http://your.server.com/public2/*

Melayani file dari direktori lokal public2.

BTW ini juga berguna jika Anda tidak ingin statis menyajikan file dari root server Anda, tetapi dari jalur yang lebih berkualitas.

HTH


1
Sempurna @etheet! Baru saja mengarahkan skrip ke direktori saya! script (src = "/ public2 / alertTest.js")
Cody

Jika menggunakan React dan mencoba melayani dua aplikasi terpisah, Anda perlu menambahkan "homepage": "/public"dan "homepage": "/public2"ke package.json aplikasi react masing-masing. Untuk info lebih lanjut tentang menggunakan dua aplikasi reaksi, lihat jawaban saya di sini stackoverflow.com/a/48569896/4746648
Danny Harding

ini sangat berguna khususnya ketika Anda menginginkan sebuah sharedfolder sehingga Anda dapat menggunakan "./"dan "./shared"dan booming Anda dapat dengan mudah berbagi file js: 3 Terima kasih
Jaacko Torus

55

Anda juga dapat "menggabungkan" direktori menjadi satu direktori yang terlihat

Struktur Direktori

  • /static
  • /alternate_static

Kode

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

Baik static dan alternate_static akan ditampilkan seolah-olah berada di direktori yang sama. Hati-hati dengan clobbers nama file.


6
Jika saya mengerti dengan benar konflik nama file tidak terjadi karena node menggunakan versi pertama dari file yang ditemukannya. Jika terlihat main.jsdi static/dalamnya tidak akan terus mencari alternate_static/.
RobW

2
Itu masih clobber jika Anda mengharapkan file tersebut alternate_staticakan pernah disajikan.
Randolpho

41

Ini tidak mungkin dilakukan dengan satu injeksi middleware, tetapi Anda dapat menginjeksi staticmiddleware beberapa kali:

app.configure('development', function(){
    app.use(express.static(__dirname + '/public1'));
    app.use(express.static(__dirname + '/public2'));
});

Penjelasan

Lihat connect / lib / middleware / static.js # 143 :

path = normalize(join(root, path));

Ada options.rootroot statis, yang Anda definisikan express.staticatau connect.staticpanggil, dan pathmerupakan jalur permintaan.

Lihat lebih lanjut di connect / lib / middleware / static.js # 154 :

  fs.stat(path, function(err, stat){
    // ignore ENOENT
    if (err) {
      if (fn) return fn(err);
     return ('ENOENT' == err.code || 'ENAMETOOLONG' == err.code)
       ? next()
       : next(err);

Lokasi diperiksa hanya sekali, dan jika file tidak ditemukan, permintaan diteruskan ke middleware berikutnya.

Pembaruan untuk Connect 2.x

Tautan ke kode tidak sebenarnya untuk Connect 2.x, tetapi beberapa penggunaan middleware statis masih memungkinkan seperti sebelumnya.


0
const express = require('express');
const path = require('path');
const pagesPath = path.join(__dirname, '/cheatsheet');
const cssPath = path.join(__dirname, '/stylesheet');
const port = process.env.PORT || 3000;

var app = express();

app.use("/cheatsheet" ,express.static(pagesPath));
app.use("/stylesheet",express.static(cssPath)); 

app.get('/',(request,response)=>{
    response.send('Hello CSS!!!');
  });

app.get('/bad',(request,response)=>{
response.send({error: 'Bad Request'});

});
app.listen(port, ()=> {
console.log(`Server is running on Port ${port}` );
console.log(__dirname);

});

// folder structure
/cheatsheet/index.html
/stylesheet/style.css
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.