res.sendFile পরম পাথ


137

আমি যদি একটি

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

তারপরে আমি একটি সার্ভার কনসোল সতর্কতা পেয়েছি

এক্সপ্রেস অবচিত res.sendfile: res.sendFileপরিবর্তে ব্যবহার করুন

তবে এটি ক্লায়েন্টের পক্ষে কাজ করে।

তবে আমি যখন এটিকে পরিবর্তন করি

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

আমি একটি ত্রুটি পেয়েছি

প্রকারের ত্রুটি: পাথ অবশ্যই নিখুঁত হতে হবে বা এর জন্য মূল নির্দিষ্ট করতে হবে res.sendFile

এবং index1.htmlরেন্ডার করা হয় না।

আমি নিখুঁত পথটি কী তা নির্ধারণ করতে অক্ষম। আমার publicহিসাবে একই স্তরের ডিরেক্টরি রয়েছে server.js। আমি res.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ভেতর থেকে ডাকছি calling app.get('/', function(req, res){res.sendFile("...")})
কেয়া টোস্ট 16

উত্তর:


310

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 বর্তমানে সঞ্চালিত স্ক্রিপ্টটি যে ডিরেক্টরিটি রয়েছে সেটিকে ফিরিয়ে দেয় your আপনার ক্ষেত্রে এটি দেখতে মনে server.jsহচ্ছে app/। সুতরাং, পেতে public, আপনি ফিরে এক স্তর প্রথম প্রয়োজন হবে: ../public/index1.html

দ্রষ্টব্য: pathএকটি অন্তর্নির্মিত মডিউল যা requireউপরের কোডটি কাজ করার জন্য ডি হওয়া দরকার :var path = require('path');


14
res.sendFile('../public/index.html', {root: __dirname});এছাড়াও কাজ করে এবং এটি আরও খাটো
ফাবিয়েন সা

এক্সপ্রেস এবং ওয়েবস্টর্ম আদর্শের সাথে কাজ করা: এতে কোনও ত্রুটি হয়নি console.log(path.join(__dirname, '../public', 'index.html'));তবে res.sendFile(path.join(__dirname, '../public', 'index.html'));কেবল এটি নিয়েই কাজ করুন var path = require('path');
Quake1TF

নিখুঁত পথটিকে প্রাক-সংজ্ঞায়িত করার কোনও উপায় নেই যাতে এটি সেন্ডফাইলে ব্যবহার করা যায়?
ইরান otzap

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

এটি আমার পক্ষে কাজ করেছে। রুট: __ ডায়ারনেম ঠিকানাটি নিয়ে যাবে যেখানে সার্ভার.জেস উপরের উদাহরণে রয়েছে এবং তারপরে সূচি 1 এইচটিএমএলতে (এই ক্ষেত্রে) ফিরে পাথটি সেই পাবলিক ফোল্ডারটি সেই ডিরেক্টরিতে পৌঁছে যাবে।


কেন এই বিকল্পটি নথিভুক্ত নয়?
টিমকে

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

__dirnameবর্তমানে সঞ্চালিত স্ক্রিপ্ট ( server.js) যে ডিরেক্টরিতে থাকে সেই ডিরেক্টরিটির নাম কোথায় পরিচালনা করবে ।


এই সমাধানটি বেশ সোজা এগিয়ে ছিল সহায়তার জন্য ধন্যবাদ .. আমি অবাক হয়েছি কেন লোকেরা একই কাজ করার জন্য 'পথ' প্যাকেজটি ব্যবহার করার পরামর্শ দেয়।
তৃতীয়

3
@ থার্ডটি আমার ধারণা, pathএটি ব্যবহার করে এটি স্বতন্ত্র makes
kmonsoor

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)

প্রতিটি অনুরোধে সূচক html এর সাথে সাড়া দেওয়ার সহজ উপায় হিসাবে এটি দ্বিগুণ হয় , কারণ আমি *আপনার স্ট্যাটিক (পাবলিক) ডিরেক্টরিতে পাওয়া যায় নি এমন সমস্ত ফাইল ধরার জন্য একটি তারা ব্যবহার করছি ; যা ওয়েব-অ্যাপ্লিকেশনগুলির জন্য সর্বাধিক সাধারণ ব্যবহারের কেস। /শুধুমাত্র মূল পথে সূচকটি ফেরত যেতে পরিবর্তন করুন ।


খুশী হলাম। সুন্দর এবং সংযুক্তি।
লার্বি

5

আমি এটি চেষ্টা করেছিলাম এবং এটি কাজ করে।

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


3

কম কোড লিখে এটি করার আরেকটি উপায়।

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

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

5
এটি "TypeError উত্পন্ন করে: পথ অবশ্যই নিখুঁত হতে হবে বা res.sendFile এ রুট নির্দিষ্ট করতে হবে"
গ্রিনএজজেড

1

আপনি সেন্ডফিলের পরিবর্তে প্রেরণটি ব্যবহার করতে পারেন যাতে আপনি ত্রুটির সাথে মুখোমুখি হন না! এই কাজগুলি আপনাকে সাহায্য করবে!

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

আপনি যদি ফাইলটি একই পৃষ্ঠাতে খুলতে চান তবে ব্যবহারকারী এটি ডাউনলোড করার পরে above উপরের কোডটিতে সংযুক্তি পরিবর্তে 'ইনলাইন' লিখুন।

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

আমি নোড.জেস ব্যবহার করি এবং একই সমস্যা ছিল ... আমি প্রতিটি স্ক্রিপ্টের শুরুতে একটি '/' যুক্ত করার চেষ্টা করেছি এবং সিএসএস স্ট্যাটিক ফাইলের সাথে লিঙ্ক করেছি।

আগে:

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

পরে:

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

এটি কাজ করার জন্য আপনাকে এক্সপ্রেস স্ট্যাটিক সার্ভারটি সেট আপ করতে হবে
Hum4n01d
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.