एक्सप्रेस .js के साथ स्थिर फाइलें


213

मैं स्थिर फ़ाइलों के रूप में सेवा index.htmlऔर /mediaउपनिर्देशिका करना चाहता हूं । अनुक्रमणिका फ़ाइल को URL /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घटक) के लिए एक अनुरोध होता है , जो निश्चित रूप से विफल हो जाता है।

कोई विचार?


वैसे, मुझे इस विषय पर एक्सप्रेस ( static()इसके परिमों) में बिल्कुल कोई दस्तावेज नहीं मिला ... निराशा होती है। एक डॉक्टर लिंक भी स्वागत है।


2
एक्सप्रेस 4.x के रूप में, पैकेज मिडलवेयर express.static()द्वारा नियंत्रित किया जाता है serve-static। आप इसके डॉक्स npmjs.com/package/serve-static या github.com/expressjs/serve-static पर पा सकते हैं ।
'

क्या कोई समझा सकता है कि "सर्वर स्थिर फाइल के रूप में" का क्या मतलब है?
अभि

@iLiveInAPineappleUnderTheSea डायनामिक वेब एप्लिकेशन में, जैसे कि एक्सप्रेस का उपयोग करते समय, एप्लिकेशन द्वारा पृष्ठ सामग्री बनाई जाती है - या उत्पन्न होती है। दूसरी ओर, स्थिर फ़ाइलों को (ज्यादातर) एक स्थिर निर्देशिका पदानुक्रम से अनमॉडिफाइड किया जाता है। उदाहरण के लिए, जबकि पृष्ठ बदल सकते हैं, छवि फ़ाइलें, CSS फाइलें और जावास्क्रिप्ट फाइलें नहीं हैं।
फिलिप कोलेंडर

नीचे दिए गए लिंक की जाँच करें only4ututorials.blogspot.com/2017/05/…
Dexter

जवाबों:


100

express.static()पहले पैरामीटर को एक निर्देशिका का पथ होने की उम्मीद है , न कि एक फ़ाइलनाम। मैं सुझाव दूंगा index.htmlकि आप अपना उपयोग करने के लिए एक और उपनिर्देशिका बनाएं ।

एक्सप्रेस दस्तावेज़ीकरण में स्थैतिक फ़ाइलों की सेवा , या अधिक विस्तृत serve-staticप्रलेखन , जिसमें सेवारत का डिफ़ॉल्ट व्यवहार शामिल हैindex.html :

डिफ़ॉल्ट रूप से यह मॉड्यूल निर्देशिका पर अनुरोध के जवाब में "index.html" फाइलें भेजेगा। इस सेट को गलत रूप से अक्षम करने के लिए या नए इंडेक्स को पसंदीदा क्रम में एक स्ट्रिंग या एरे को पास करने के लिए।


6
और बस जानकारी के लिए, यह उस अन्य निर्देशिका में डिफ़ॉल्ट रूप से index.html की सेवा करेगा
TheSteve0

यदि केवल एक पैरामीटर है - तो express.staticउम्मीद है कि एक पैरामीटर पथ होगा ....
सेटी

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

प्रलेखन के लिए, चूंकि एक्सप्रेस कनेक्ट मिडलवेयर का उपयोग करता है, इसलिए मैंने सीधे कनेक्ट सोर्स कोड को देखना आसान समझा।

उदाहरण के लिए यह रेखा दर्शाती है कि index.html https://github.com/senchalabs/connect/blob/2.3.3/lib/middleware/static.js#L140 समर्थित है


15
Application.configure()3.x में विरासत के रूप में प्रलेखित किया गया था और 4.x में हटा दिया गया था। एक अद्यतन उदाहरण के लिए क्रिसकैंटरेल का उत्तर देखें।
अनम

धन्यवाद, इससे बहुत मदद मिली
mdegges

क्या है __dirname? क्या इसकी कीमत है?
अभि

1
नवीनतम एक्सप्रेस के लिए पुराना है।
जॉन हेटर

133

एक्सप्रेस के नवीनतम संस्करण में "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');

__dirname कीवर्ड है?
मोहम्मद फैजान खान

6
यह आपके नोडज मॉड्यूल में एक वैश्विक है। nodejs.org/docs/latest/api/globals.html#globals_dirname
ChrisCantrell

7
__dirname वास्तव में वैश्विक नहीं है, बल्कि प्रत्येक मॉड्यूल के लिए स्थानीय है।
मोहम्मद फैजान खान

2
यह अजगर के बराबर है __file__जिसका आप उपयोग करते हैंos.path.dirname(os.path.realpath(__file__))
अब्देलौहाब

अगर मेरे पास फ़ाइल में है तो @ChrisCantrell मैं स्थैतिक फ़ोल्डर में कैसे जोड़ सकता हूँ public/teams/logo.png?
माइकल

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 आप अधिक कृपया समझा सकते हैं
मोहम्मद ज़मीर

क्या @ATOzTOA कह रहा है आप बदलना चाहिए है path.join(public + 'index.html')में path.join(public, 'index.html'), जबकि यह पर, परिवर्तन और __dirname + "/public/"मेंpath.join(__dirname, 'public')
Vozzie

इससे मुझे एक स्थिर साइट को एक एपीआई के साथ सभी में संयोजन करने में मदद मिली
जेफ बेगले

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 फ़ोल्डर के अंदर है) के माध्यम से सीधे पहुँचा जा सकता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.