Node.js Express çerçevesinde iki farklı statik dizin kurma


101

Mümkün mü? Statik dosyaları sunmak için iki farklı dizin oluşturmak istiyorum. Diyelim ki / public ve / mnt


2
Bu sayfa bunun mümkün olduğunu söylüyor gibi görünüyor, ancak bundan daha fazla detaya girmiyor.
pırasa

Yanıtlar:


152

Ayrıca, use()hoşunuza giden ek (ilk) bir parametre belirleyerek, statik dosyaların web'e sunulacağı yolu da ayarlayabilirsiniz :

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

Bu şekilde, iki yerel dizin arasında başarısız olan tek bir url yolu değil, yerel dizinlerinizi yansıtan iki farklı dizin elde edersiniz.

Başka bir deyişle, URL kalıbı:

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

Dosyaları yerel dizinden publicsunarken:

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

Dosyaları yerel dizinden sunar public2.

BTW, statik dosyaların sunucunuzun kökünden değil, daha nitelikli bir yoldan sunulmasını istemiyorsanız da yararlıdır.

HTH


1
Mükemmel @facetcounter! Dizinime bir komut dosyası işaret ettim! script (src = "/ public2 / alertTest.js")
Cody

React kullanıyorsanız ve iki ayrı uygulama sunmaya çalışıyorsanız , ilgili react uygulamasının package.json dosyasına "homepage": "/public"ve eklemeniz gerekir "homepage": "/public2". İki react uygulamasını kullanma hakkında daha fazla bilgi için
Danny Harding

Bir istediğinizde bu özel çok yararlıdır sharedkullanabilirsiniz böylece klasör "./"ve "./shared"3 teşekkür ederiz: ve kolayca paylaşmak js dosyaları bom
Jaacko Torus

55

Ayrıca dizinleri tek bir görünür dizinde "birleştirebilirsiniz"

Dizin Yapısı

  • /static
  • /alternate_static

Kod

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

Hem statik hem de alternate_static aynı dizindeymiş gibi sunulacaktır. Yine de dosya adı yoncalarına dikkat edin.


6
Doğru anlarsam dosya adı çakışmaları olmaz çünkü düğüm bulduğu dosyanın ilk sürümünü kullanır. Eğer onu görürse main.js, static/bakmaya devam etmez alternate_static/.
RobW

2
Dosyanın alternate_staticteslim edilmesini bekliyor olsaydınız, bu hala bir tıkanıklıktır .
Randolpho

41

Tek bir ara katman yazılımı enjeksiyonu ile mümkün değildir, ancak staticara katman yazılımını birden çok kez enjekte edebilirsiniz :

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

Açıklama

Bak bağlantı / lib / katman / static.js # 143 :

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

İçinde options.roottanımladığınız express.staticveya connect.staticçağırdığınız statik kök vardır ve pathistek yolu vardır.

Connect / lib / middleware / static.js # 154'e daha fazla bakın :

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

Yol yalnızca bir kez kontrol edildi ve dosya bulunamazsa istek sonraki ara yazılıma iletildi.

Connect 2.x için güncelleme

Connect 2.x için koda bağlantılar gerçek değildir, ancak daha önce olduğu gibi çoklu statik ara yazılım kullanımı hala mümkündür.


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
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.