node.js TypeError: পথ অবশ্যই নিখুঁত হতে হবে বা res.sendFile এ রুট নির্দিষ্ট করতে হবে [জেএসএন পার্স করতে ব্যর্থ হয়েছে]


152

[যুক্ত] সুতরাং আমার পরবর্তী সমস্যাটি হ'ল যখন আমি একটি নতুন নির্ভরতা যুক্ত করার চেষ্টা করি (এনপিএম ইনস্টল - সেভ সকেট.ইও)। জেএসওএন ফাইলটিও বৈধ। আমি এই ত্রুটিটি পেয়েছি: জেসনকে পার্স করতে ব্যর্থ

npm ERR! Unexpected string
npm ERR! File: /Users/John/package.json
npm ERR! Failed to parse package.json data.
npm ERR! package.json must be actual JSON, not just JavaScript.
npm ERR! 
npm ERR! This is not a bug in npm.
npm ERR! Tell the package author to fix their package.json file. JSON.parse 

সুতরাং আমি এই ত্রুটিটি কেন ফিরে আসছিল তা জানার চেষ্টা করছি। সমস্ত ফাইল (এইচটিএমএল, জেএসএন, জেএস) আমার ডেস্কটপে একই ফোল্ডারের ভিতরে রয়েছে। আমি নোড.জেএস এবং সকেট.আইও ব্যবহার করছি

এটি আমার জেএস ফাইল:

var app = require('express')();
var http = require('http').Server(app);

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

http.listen(3000,function(){
    console.log('listening on : 3000');
});

এটাই প্রত্যাবর্তন হচ্ছে:

MacBook-Pro:~ John$ node /Users/John/Desktop/Chatapp/index.js 
listening on : 3000
TypeError: path must be absolute or specify root to res.sendFile
    at ServerResponse.sendFile (/Users/John/node_modules/express/lib/response.js:389:11)
    at /Users/John/Desktop/Chatapp/index.js:5:7
    at Layer.handle [as handle_request] (/Users/John/node_modules/express/lib/router/layer.js:76:5)
    at next (/Users/John/node_modules/express/lib/router/route.js:100:13)
    at Route.dispatch (/Users/John/node_modules/express/lib/router/route.js:81:3)
    at Layer.handle [as handle_request] (/Users/John/node_modules/express/lib/router/layer.js:76:5)
    at /Users/John/node_modules/express/lib/router/index.js:234:24
    at Function.proto.process_params (/Users/John/node_modules/express/lib/router/index.js:312:12)
    at /Users/John/node_modules/express/lib/router/index.js:228:12
    at Function.match_layer (/Users/John/node_modules/express/lib/router/index.js:295:3)
TypeError: path must be absolute or specify root to res.sendFile
    at ServerResponse.sendFile (/Users/John/node_modules/express/lib/response.js:389:11)
    at /Users/John/Desktop/Chatapp/index.js:5:7
    at Layer.handle [as handle_request] (/Users/John/node_modules/express/lib/router/layer.js:76:5)
    at next (/Users/John/node_modules/express/lib/router/route.js:100:13)
    at Route.dispatch (/Users/John/node_modules/express/lib/router/route.js:81:3)
    at Layer.handle [as handle_request] (/Users/John/node_modules/express/lib/router/layer.js:76:5)
    at /Users/John/node_modules/express/lib/router/index.js:234:24
    at Function.proto.process_params (/Users/John/node_modules/express/lib/router/index.js:312:12)
    at /Users/John/node_modules/express/lib/router/index.js:228:12
    at Function.match_layer (/Users/John/node_modules/express/lib/router/index.js:295:3)

উত্তর:


331

ত্রুটিটি বেশ পরিষ্কার, আপনাকে একটি নিখুঁত (আপেক্ষিকের পরিবর্তে) পথ এবং / অথবা rootএর জন্য কনফিগার অবজেক্টে সেট করতে হবে res.sendFile()। উদাহরণ:

// assuming index.html is in the same directory as this script

res.sendFile(__dirname + '/index.html');

বা একটি শিকড় নির্দিষ্ট করুন (যা প্রথম আর্গুমেন্টের জন্য বেস পাথ হিসাবে ব্যবহৃত হয় res.sendFile():

res.sendFile('index.html', { root: __dirname });

rootআপনি যখন কোনও ব্যবহারকারী-উত্পাদিত ফাইল পাথটি পাস করছেন তখন পাথ নির্দিষ্ট করে দেওয়া আরও কার্যকর। যেমন: সম্ভাব্যভাবে ত্রুটিযুক্ত / দূষিত অংশ যেমন ..(যেমন ../../../../../../etc/passwd) contain rootপথ নির্ধারণ করা এই ধরণের দূষিত পাথগুলি সেই বেস পাথের বাইরে ফাইল অ্যাক্সেস করতে ব্যবহার করা থেকে বাধা দেয়।


1
একটি dir আপ হিসাবে রুট নির্দিষ্ট করার সেরা উপায় কি?
সুপারউবারডুপার

1
আপনি কি পছন্দ করছেন path.resolve(__dirname, '.../public')? এটি স্ক্রিপ্টের মূল ডিরেক্টরিটির 'সর্বজনীন' উপ-ডিরেক্টরিতে সমাধান করবে to
mscdex

শান্ত! এটি কি ভবিষ্যতে স্থায়ীভাবে এই মানটিকে __ ডিরেক্টরিতে সঞ্চয় করে?
সুপারউবারডুপার

1
হাই, আমি নিম্নলিখিত res.sendFile চেষ্টা করেছি (path.resolve (__ dirname + '/index.html', '../')) তবে বার্তাটি পান: পেতে পারি না /
সুপারউবারডুপার

2
@ সুপারউবারডুপার <- এই লোকটির অধিকার ছিল (কমপক্ষে আমার জন্য)। তিনি সংকল্প ফাংশনটি ব্যবহার করছেন যা আপনাকে পাথকে স্বাভাবিক করে তোলে ../../<etc>টাইপ সিনট্যাক্সের সাহায্যে চারপাশে চলাচল করতে । __dirnameএবং এর মধ্যে কমা লক্ষ্য করুন ../public। একটি + চিহ্ন ব্যবহার করে কাজ হয় না।
হেলজগেট

20

রুট পাথ যোগ করার চেষ্টা করুন।

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

12

.mjs ফাইলে আমাদের আপাতত __ ডিরেক্টরি নেই

অত: পর

res.sendFile('index.html', { root: '.' })

এটি আমার জন্য একটি ভাল সমাধান হিসাবে কাজ করেছে কারণ __dirname দিয়ে পথ পাওয়ার পরে ফিরে আসা আমার প্রয়োজন ছিল o সুতরাং আমি res.sendFile ('index.html', {মূল: '। / প্রকাশ্য / পর্যালোচনা'}) দিয়েছি;
নীলকণ্ঠ সিংহ দেও

হ্যান্ডেলবারগুলিতে SITEMAP.XML এর জন্য, এটি সঠিক সমাধান। আপনাকে অনেক ধন্যবাদ
টাইটোইহ

3

আপনি যদি এই পথটিকে বিশ্বাস করেন, তবে পথ.প্রসারণ হল একটি বিকল্প:

var path = require('path');

// All other routes should redirect to the index.html
  app.route('/*')
    .get(function(req, res) {
      res.sendFile(path.resolve(app.get('appPath') + '/index.html'));
    });

3

ত্রুটিটি বেশ সোজা। সম্ভবত সম্ভবত কারণ আপনার সূচি। Html ফাইলটি মূল ডিরেক্টরিতে নেই in

অথবা যদি এটি মূল ডিরেক্টরিতে থাকে তবে আপেক্ষিক রেফারেন্সিং কাজ করছে না।

সুতরাং আপনাকে সার্ভারকে আপনার ফাইলের সঠিক অবস্থানটি বলতে হবে। নোডজেগুলিতে ডায়ারনেম পদ্ধতি ব্যবহার করে এটি করা যেতে পারে। এই কোডটি দিয়ে কেবল আপনার কোডটি প্রতিস্থাপন করুন:

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

আপনার হোমপেজের আগে স্ল্যাশ "/" চিহ্নটি যুক্ত করেছেন তা নিশ্চিত করুন। অন্যথায় আপনার পথ হয়ে যাবে: rootDirectoryindex.html

আপনি যেহেতু এটি চান: rootDirectory / index.html


1

আমি পাথ ভেরিয়েবল ব্যবহার করে এটি সমাধান করি। নমুনা কোড নীচের মত দেখতে হবে।

var path = require("path");

app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname + '/index.html'));
})

0

আপনি যদি রুট ডিরেক্টরিতে কাজ করছেন তবে আপনি এই পদ্ধতির ব্যবহার করতে পারেন

res.sendFile(__dirname + '/FOLDER_IN_ROOT_DIRECTORY/index.html');

তবে আপনি যদি কোনও ফোল্ডারের অভ্যন্তরে থাকা রুটগুলি ব্যবহার করে থাকেন তবে এটির জন্য /Routes/someRoute.jsআপনাকে এরকম কিছু করা দরকার

const path = require("path");
...
route.get("/some_route", (req, res) => {
   res.sendFile(path.resolve('FOLDER_IN_ROOT_DIRECTORY/index.html')
});

0

আইকনের আপেক্ষিক পথ সহ টাইপস্ক্রিপ্টে:

import path from 'path';

route.get('/favicon.ico', (_req, res) => res.sendFile(path.join(__dirname, '../static/myicon.png')));


0

আমি নীচের কোডটি ব্যবহার করেছি এবং সাইটম্যাপ.এক্সএমএল ফাইলটি দেখানোর চেষ্টা করেছি

router.get('/sitemap.xml', function (req, res) {
    res.sendFile('sitemap.xml', { root: '.' });
});

-1

এটি অন্য উপায়ে সমাধান করা যেতে পারে:

app.get("/", function(req, res){

    res.send(`${process.env.PWD}/index.html`)

});

process.env.PWD প্রক্রিয়া শুরু হওয়ার সাথে সাথে ওয়ার্কিং ডিরেক্টরিটি পুনরায় সরবরাহ করবে।


-2

আমি এটি করেছি এবং এখন আমার অ্যাপ্লিকেশন সঠিকভাবে কাজ করছে,

res.sendFile('your drive://your_subfolders//file.html');

ফাইলের অবস্থানটি হার্ডকোড করা খারাপ অভ্যাস। আপনি যদি অ্যাপ্লিকেশনটিকে অন্য কোনও মেশিনে স্থাপন করেন তবে ফাইলটির পথটি সম্ভবত সবচেয়ে আলাদা হবে
মেরভে সাহিন

-3

আপনি সম্ভবত আপনার ডিরেক্টরিতে ডাবল স্ল্যাশ ব্যবহার বিবেচনা করতে পারেন

app.get('/',(req,res)=>{
    res.sendFile('C:\\Users\\DOREEN\\Desktop\\Fitness Finder' + '/index.html')
})

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