ไฟล์คงที่กับ express.js


213

ฉันต้องการให้บริการindex.htmlและ/mediaไดเรกทอรีย่อยเป็นไฟล์คงที่ ไฟล์ดัชนีควรให้บริการทั้งที่/index.htmlและ/URL

ฉันมี

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

แต่เห็นได้ชัดว่าบรรทัดที่สองให้บริการทั้งหมด__dirnameรวมถึงไฟล์ทั้งหมดในนั้น (ไม่ใช่แค่index.htmlและmedia) ซึ่งฉันไม่ต้องการ

ฉันก็ลอง

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

แต่การเข้าถึง URL พื้นฐาน/จะนำไปสู่คำขอไปยังweb_server/index.html/index.html( index.htmlองค์ประกอบสองเท่า) ซึ่งแน่นอนว่าล้มเหลว

ความคิดใด ๆ


โดยวิธีการที่ฉันไม่สามารถหาเอกสารอย่างแน่นอนใน Express ในหัวข้อนี้ ( static()+ params ของมัน) ... น่าผิดหวัง ยินดีต้อนรับลิงก์ของ doc


2
ตั้งแต่ 4.x ด่วนexpress.static()จัดการโดยserve-staticpackage มิดเดิลแวร์ คุณสามารถหาเอกสารที่npmjs.com/package/serve-staticหรือgithub.com/expressjs/serve-static
Anm

ใครสามารถช่วยอธิบายว่า "เซิร์ฟเวอร์เป็นไฟล์คงที่" หมายถึงอะไร
Abhi

@iLiveInAPineappleUnderTheSea ในแอปพลิเคชันเว็บแบบไดนามิกเช่นเมื่อใช้ Express เนื้อหาของหน้าเว็บจะถูกสร้างหรือสร้างโดยแอปพลิเคชัน ในทางตรงกันข้ามไฟล์สแตติกจะให้บริการ (ส่วนใหญ่) ไม่มีการแก้ไขจากลำดับชั้นไดเรกทอรีคงที่ ตัวอย่างเช่นในขณะที่หน้าอาจมีการเปลี่ยนแปลงไฟล์ภาพ, ไฟล์ CSS และไฟล์ Javascript ไม่ได้
Philip Callender

ตรวจสอบลิงค์ด้านล่างonly4ututorials.blogspot.com/2017/05/…
Dexter

คำตอบ:


100

express.static()คาดว่าพารามิเตอร์แรกจะเป็นเส้นทางของไดเรกทอรีไม่ใช่ชื่อไฟล์ ฉันขอแนะนำให้สร้างไดเรกทอรีย่อยอื่นเพื่อเก็บของคุณindex.htmlและใช้สิ่งนั้น

การให้บริการไฟล์คงที่ในเอกสาร Express หรือเอกสารรายละเอียดเพิ่มเติมserve-staticรวมถึงพฤติกรรมเริ่มต้นของการให้บริการindex.html :

โดยค่าเริ่มต้นโมดูลนี้จะส่งไฟล์“ index.html” เพื่อตอบสนองคำขอในไดเรกทอรี หากต้องการปิดใช้งานชุดนี้เป็นเท็จหรือให้ดัชนีใหม่ส่งผ่านสตริงหรืออาร์เรย์ตามลำดับที่ต้องการ


6
และสำหรับข้อมูลมันจะแสดงผล index.html ตามค่าเริ่มต้นในไดเรกทอรีอื่น
TheSteve0

หากมีเพียงหนึ่งพารามิเตอร์ - ดังนั้นexpress.staticคาดว่าหนึ่งพารามิเตอร์ที่จะเป็นเส้นทาง ....
22416 Seti

188

หากคุณมีการตั้งค่านี้

/app
   /public/index.html
   /media

จากนั้นควรได้รับสิ่งที่คุณต้องการ

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

เคล็ดลับคือออกจากบรรทัดนี้เป็นทางเลือกสุดท้าย

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

สำหรับเอกสารเนื่องจาก Express ใช้การเชื่อมต่อมิดเดิลแวร์ฉันพบว่าง่ายกว่าที่จะดูซอร์สโค้ดการเชื่อมต่อโดยตรง

ตัวอย่างเช่นบรรทัดนี้แสดงว่าได้รับการสนับสนุน index.html https://github.com/senchalabs/connect/blob/2.3.3/lib/middleware/static.js#L140


15
Application.configure()ถูกบันทึกเป็นมรดกใน 3.x และนำออกใน 4.x ดูคำตอบของ ChrisCantrell สำหรับตัวอย่างที่อัปเดต
Anm

ขอบคุณสิ่งนี้ช่วยได้มาก
mdegges

สิ่งที่เป็น__dirname? คุณค่าของมันคืออะไร?
Abhi

1
ล้าสมัยสำหรับด่วนล่าสุด
John Heeter

133

ในรุ่นใหม่ล่าสุดของ express "createServer" เลิกใช้แล้ว ตัวอย่างนี้ใช้ได้สำหรับฉัน:

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

__ ชื่อคือคำหลัก?
Mohammad Faizan khan

6
เป็นโกลบอลในโมดูล nodejs ของคุณ nodejs.org/docs/latest/api/globals.html#globals_dirname
ChrisCantrell

7
__ ชื่อเล่นไม่ใช่ชื่อจริงของโลก แต่เป็นชื่อท้องถิ่นของแต่ละโมดูล
Mohammad Faizan khan

2
นี่เทียบเท่ากับงูหลาม__file__ที่คุณใช้กับos.path.dirname(os.path.realpath(__file__))
Abdelouahab

@ChrisCantrell ฉันจะเพิ่มไปยังโฟลเดอร์สแตติกได้อย่างไรถ้าฉันมีไฟล์อยู่public/teams/logo.png?
michal

37

res.sendFile& express.staticทั้งสองอย่างนี้จะได้ผล

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

publicโฟลเดอร์ที่รหัสฝั่งไคลเอ็นต์อยู่ที่ไหน

ตามที่ได้รับการแนะนำโดย@ATOzTOAและชี้แจงโดย @Vozzieให้path.joinใช้พา ธ เพื่อเข้าร่วมเป็นอาร์กิวเมนต์อาร์กิวเมนต์+จะผ่านอาร์กิวเมนต์หนึ่งไปยังพา ธ


2
path.joinใช้พา ธ เพื่อเข้าร่วมเป็นอาร์กิวเมนต์การ+ส่งผ่านอาร์กิวเมนต์เดียวไปยังพา ธ
ATOzTOA

@ATOzTOA คุณสามารถอธิบายเพิ่มเติมได้โปรด
Mohammed Zameer

สิ่งที่ @ ATOzTOA กำลังพูดคือคุณควรเปลี่ยนpath.join(public + 'index.html')เป็นpath.join(public, 'index.html')และในขณะที่มันเปลี่ยน__dirname + "/public/"เป็นpath.join(__dirname, 'public')
Vozzie

สิ่งนี้ช่วยฉันในการรวมไซต์คงที่กับ API ทั้งหมดในที่เดียว
Jeff Beagley

4
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')
})

2

npm ติดตั้งบริการ - ดัชนี

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

2

ใช้ด้านล่างภายใน app.js ของคุณ

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

(folderName คือโฟลเดอร์ที่มีไฟล์) - โปรดจำไว้ว่าสินทรัพย์เหล่านี้เข้าถึงได้โดยตรงผ่านเส้นทางเซิร์ฟเวอร์ (เช่นhttp: // localhost: 3000 / abc.png (โดยที่ abc.png อยู่ในโฟลเดอร์ folderName)

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