การตั้งค่าไดเร็กทอรีแบบคงที่ที่แตกต่างกันสองรายการในเฟรมเวิร์ก node.js Express


101

เป็นไปได้ไหม? ฉันต้องการตั้งค่าไดเรกทอรีที่แตกต่างกันสองรายการเพื่อให้บริการไฟล์แบบคงที่ สมมติว่า / public และ / mnt


2
หน้านี้ดูเหมือนจะบอกว่าเป็นไปได้ แต่ไม่ได้ลงรายละเอียดมากไปกว่านั้น
ต้นหอม

คำตอบ:


152

คุณยังสามารถกำหนดเส้นทางที่จะให้บริการไฟล์แบบคงที่ไปยังเว็บได้โดยระบุพารามิเตอร์เพิ่มเติม (แรก) ที่use()ต้องการดังนี้:

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

ด้วยวิธีนี้คุณจะได้รับสองไดเรกทอรีที่แตกต่างกันบนเว็บที่สะท้อนไดเรกทอรีท้องถิ่นของคุณไม่ใช่เส้นทาง URL เดียวที่ล้มเหลวระหว่างสองไดเรกทอรีภายในเครื่อง

กล่าวอีกนัยหนึ่งคือรูปแบบ URL:

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

ให้บริการไฟล์จากไดเร็กทอรีโลคัลpublicในขณะที่:

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

public2ให้บริการไฟล์จากไดเรกทอรีท้องถิ่น

BTW สิ่งนี้มีประโยชน์เช่นกันหากคุณไม่ต้องการให้คงที่เพื่อให้บริการไฟล์จากรากของเซิร์ฟเวอร์ของคุณ แต่มาจากเส้นทางที่ตรงกว่า

HTH


1
สมบูรณ์แบบ @facetcounter! แค่ชี้สคริปต์ไปที่ไดเร็กทอรีของฉัน! สคริปต์ (src = "/ public2 / alertTest.js")
Cody

หากใช้ React และพยายามให้บริการสองแอพแยกกันคุณต้องเพิ่ม"homepage": "/public"และ"homepage": "/public2"ลงใน package.json ของแอพ react ที่เกี่ยวข้อง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้แอป react สองแอปดูคำตอบของฉันที่นี่stackoverflow.com/a/48569896/4746648
Danny Harding

สิ่งนี้มีประโยชน์มากเป็นพิเศษเมื่อคุณต้องการsharedโฟลเดอร์เพื่อให้คุณสามารถใช้"./"และ"./shared"และบูมคุณสามารถแบ่งปันไฟล์ js ได้อย่างง่ายดาย: 3 ขอบคุณ
Jaacko Torus

55

คุณยังสามารถ "รวม" ไดเรกทอรีเป็นไดเรกทอรีเดียวที่มองเห็นได้

โครงสร้างไดเรกทอรี

  • /static
  • /alternate_static

รหัส

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

ทั้ง static และ alternate_static จะถูกทำหน้าที่ราวกับว่าอยู่ในไดเร็กทอรีเดียวกัน ระวังชื่อไฟล์ clobbers ด้วย


6
ถ้าฉันเข้าใจความขัดแย้งของชื่อไฟล์อย่างถูกต้องจะไม่เกิดขึ้นเนื่องจากโหนดใช้เวอร์ชันแรกของไฟล์ที่พบ ถ้ามันเห็นmain.jsในมันจะไม่ยังคงมองในstatic/ alternate_static/
RobW

2
นั่นยังคงเป็นเรื่องยากหากคุณคาดหวังว่าไฟล์alternate_staticจะถูกเสิร์ฟ
Randolpho

41

ไม่สามารถทำได้โดยการแทรกมิดเดิลแวร์เดียว แต่คุณสามารถฉีดstaticมิดเดิลแวร์ได้หลายครั้ง:

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

คำอธิบาย

ดูที่connect / lib / middleware / static.js # 143 :

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

มีoptions.rootรากแบบคงที่ซึ่งคุณกำหนดexpress.staticหรือconnect.staticเรียกใช้และpathเป็นเส้นทางการร้องขอ

ดูเพิ่มเติมที่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);

เส้นทางตรวจสอบเพียงครั้งเดียวและหากไม่พบไฟล์คำขอส่งผ่านไปยังมิดเดิลแวร์ถัดไป

อัปเดตสำหรับ Connect 2.x

ลิงก์ไปยังโค้ดไม่สามารถใช้งานได้สำหรับ Connect 2.x แต่การใช้งานมิดเดิลแวร์แบบคงที่หลายรายการยังคงเป็นไปได้เช่นเดิม


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.