res.sendFile निरपेक्ष पथ


137

अगर मैं ए

res.sendfile('public/index1.html'); 

तब मुझे एक सर्वर कंसोल चेतावनी मिलती है

व्यक्त पदावनत res.sendfile: res.sendFileइसके बजाय का उपयोग करें

लेकिन यह ग्राहक की तरफ से ठीक काम करता है।

लेकिन जब मैं इसे बदलता हूं

res.sendFile('public/index1.html');

मुझे एक त्रुटि मिलती है

TypeError: पथ पूर्ण होना चाहिए या रूट निर्दिष्ट करना चाहिए res.sendFile

और index1.htmlप्रदान नहीं किया गया है।

मैं यह पता लगाने में असमर्थ हूं कि निरपेक्ष मार्ग क्या है। मेरे पास publicउसी स्तर पर निर्देशिका है server.jsres.sendFileसे कर रहा हूं server.js। मैंने भी घोषित किया हैapp.use(express.static(path.join(__dirname, 'public')));

मेरी निर्देशिका संरचना जोड़ना:

/Users/sj/test/
....app/
........models/
....public/
........index1.html

यहाँ निर्दिष्ट किया जाने वाला निरपेक्ष मार्ग क्या है?

मैं एक्सप्रेस 4.x का उपयोग कर रहा हूं।


यदि आप express.staticअपनी सार्वजनिक निर्देशिका की सेवा करने के लिए मिडलवेयर का उपयोग कर रहे हैं , तो आपको res.sendFileभेजने की आवश्यकता क्यों है public/index1.html?
माइक एस

1
मैं इसे माँगने res.sendFileके app.get('/', function(req, res){res.sendFile("...")})लिए भेज रहा हूँ ।
काया टोस्ट

जवाबों:


311

express.staticमिडलवेयर से अलग है res.sendFileतो अपने लिए एक निरपेक्ष पथ के साथ आरंभ करने, publicनिर्देशिका के लिए कुछ भी नहीं होगा res.sendFile। आपको सीधे एक पूर्ण पथ का उपयोग करने की आवश्यकता है res.sendFile। इसे करने के दो सरल तरीके हैं:

  1. res.sendFile(path.join(__dirname, '../public', 'index1.html'));
  2. res.sendFile('index1.html', { root: path.join(__dirname, '../public') });

नोट: __dirname वह निर्देशिका लौटाता है जो वर्तमान में स्क्रिप्ट निष्पादित कर रहा है। आपके मामले में, ऐसा लगता है कि server.jsवह अंदर है app/। तो, पाने के लिए public, आपको पहले एक स्तर वापस करना होगा ../public/index1.html:।

नोट: pathएक अंतर्निहित मॉड्यूल है जिसे requireकार्य करने के लिए उपरोक्त कोड के लिए घ की आवश्यकता होती है :var path = require('path');


14
res.sendFile('../public/index.html', {root: __dirname});यह भी काम करता है और यह छोटा है
Fabien Sa

एक्सप्रेस और वेबस्टॉर्म विचारधारा के साथ काम करना: कोई त्रुटि नहीं हुई console.log(path.join(__dirname, '../public', 'index.html'));लेकिन res.sendFile(path.join(__dirname, '../public', 'index.html'));केवल साथ काम करें var path = require('path');
Quake1TF

क्या पूर्ण पथ को पूर्व-परिभाषित करने का कोई तरीका नहीं है इसलिए इसका उपयोग SendFile में किया जा सकता है?
इरान ओटज़ैप

4
res.sendFile('../public/index.html', {root: __dirname});काम नहीं करता (अब), क्योंकि यह रूट के ऊपर जाने के कारण 403 निषिद्ध है। res.sendFile('public/index.html', {root: path.dirname(__dirname)});इसके बजाय करो ।
ट्रेवर रॉबिन्सन

48

इसके बजाय बस कोशिश करें:

res.sendFile('public/index1.html' , { root : __dirname});

इसने मेरे लिए काम किया। रूट: __ dirname पता लेगा जहां server.js उपरोक्त उदाहरण में है और फिर index1.html (इस मामले में) को प्राप्त करने के लिए लौटाया गया पथ उस निर्देशिका में जाना है जहां सार्वजनिक फ़ोल्डर है।


यह विकल्प प्रलेखित क्यों नहीं है?
टाइमके

9
res.sendFile( __dirname + "/public/" + "index1.html" );

__dirnameउस निर्देशिका के नाम का प्रबंधन कहां करेगा जो वर्तमान में स्क्रिप्टिंग ( server.js) निष्पादित कर रही है।


यह समाधान बहुत सीधे आगे था मदद के लिए धन्यवाद .. मुझे आश्चर्य है कि लोग ऐसा करने के लिए 'पथ' पैकेज का उपयोग करने की सलाह क्यों देते हैं।
तीसरा

3
@ मुझे लगता है, का उपयोग कर pathयह ओएस स्वतंत्र बनाता है।
किमी।

7

एक विकल्प जिसे अभी तक सूचीबद्ध नहीं किया गया है जो मेरे लिए काम करता है वह बस path.resolveया तो अलग-अलग तारों का उपयोग कर रहा है या पूरे पथ के साथ बस एक:

// comma separated
app.get('/', function(req, res) {
    res.sendFile( path.resolve('src', 'app', 'index.html') );
});

या

// just one string with the path
app.get('/', function(req, res) {
    res.sendFile( path.resolve('src/app/index.html') );
});

(नोड v6.10.0)

आइडिया https://stackoverflow.com/a/14594282/6189078 से प्राप्त किया गया


6

अन्य उत्तरों के आधार पर, यह सबसे सामान्य आवश्यकता को पूरा करने का एक सरल उदाहरण है:

const app = express()
app.use(express.static('public')) // relative path of client-side code
app.get('*', function(req, res) {
    res.sendFile('index.html', { root: __dirname })
})
app.listen(process.env.PORT)

यह हर अनुरोध पर index.html के साथ प्रतिक्रिया करने का एक सरल तरीका के रूप में भी दोगुना हो जाता है , क्योंकि मैं *उन सभी फ़ाइलों को पकड़ने के लिए एक स्टार का उपयोग कर रहा हूं जो आपके स्थिर (सार्वजनिक) निर्देशिका में नहीं मिली थीं; जो वेब-ऐप्स के लिए सबसे आम उपयोग का मामला है। /इंडेक्स को केवल रूट पथ में वापस करने के लिए बदलें ।


अच्छा लगा। अच्छा और रसीला।
lharby

5

मैंने यह कोशिश की और यह काम कर गया।

app.get('/', function (req, res) {
    res.sendFile('public/index.html', { root: __dirname });
});

4

process.cwd() आपकी परियोजना का पूर्ण मार्ग देता है।

फिर :

res.sendFile( `${process.cwd()}/public/index1.html` );

3

कम कोड लिखकर ऐसा करने का दूसरा तरीका।

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

app.get('/', function(req, res) {
   res.sendFile('index.html');
});

5
यह "TypeError: पथ को पूर्ण बनाता है या res.sendFile को रूट निर्दिष्ट करता है" उत्पन्न करता है
GreenAsJade

1

आप भेजने के बजाय SendFile का उपयोग कर सकते हैं ताकि आप त्रुटि के साथ सामना न करें! यह काम आपकी मदद करेगा!

fs.readFile('public/index1.html',(err,data)=>{
if(err){
  consol.log(err);
}else {
res.setHeader('Content-Type', 'application/pdf');

ब्राउज़र को यह बताने के लिए कि आपकी प्रतिक्रिया पीडीएफ का प्रकार है

res.setHeader('Content-Disposition', 'attachment; filename='your_file_name_for_client.pdf');

यदि आप चाहते हैं कि उपयोगकर्ता द्वारा डाउनलोड किए जाने के बाद यह फ़ाइल उसी पृष्ठ पर तुरंत खुले तो इसे उपरोक्त कोड में अनुलग्नक के बजाय 'इनलाइन' लिखें।

res.send(data)

0

यदि आप इसे एक बार सेट करना चाहते हैं और हर जगह इसका उपयोग करना चाहते हैं, तो बस अपने स्वयं के मिडलवेयर को कॉन्फ़िगर करें। जब आप अपना ऐप सेट कर रहे हों, तो प्रतिक्रिया ऑब्जेक्ट पर एक नए फ़ंक्शन को परिभाषित करने के लिए निम्नलिखित का उपयोग करें:

app.use((req, res, next) => {
  res.show = (name) => {
    res.sendFile(`/public/${name}`, {root: __dirname});
  };
  next();
});

फिर इसे निम्नानुसार उपयोग करें:

app.get('/demo', (req, res) => {
  res.show("index1.html");
});

0

मैं Node.Js का उपयोग करता हूं और एक ही समस्या थी ... मैंने हर स्क्रिप्ट की शुरुआत में एक '/' जोड़कर हल किया और एक सीएसएस स्टेटिक फाइल का लिंक दिया।

इससे पहले:

<link rel="stylesheet" href="assets/css/bootstrap/bootstrap.min.css">

उपरांत:

<link rel="stylesheet" href="/assets/css/bootstrap/bootstrap.min.css">

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