नोड। प्रकार टाइप: पथ निरपेक्ष होना चाहिए या res.sendFile को रूट निर्दिष्ट करना चाहिए [JSON को पार्स करने में विफल]


152

[add] तो मेरी अगली समस्या यह है कि जब मैं एक नई निर्भरता जोड़ने की कोशिश करता हूं (npm install --save socket.io)। JSON फ़ाइल भी मान्य है। मुझे यह त्रुटि मिली: json पार्स करने में विफल

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 

इसलिए मैं यह पता लगाने की कोशिश कर रहा हूं कि यह त्रुटि क्यों लौट रही है। सभी फ़ाइलें (HTML, JSON, JS) मेरे डेस्कटॉप पर एक ही फ़ोल्डर के अंदर हैं। मैं नोड.जेएस और सॉकेट का उपयोग कर रहा हूं

यह मेरी JS फाइल है:

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) हो सकते हैं। rootपथ को सेट करना ऐसे दुर्भावनापूर्ण पथों को उस आधार पथ के बाहर फ़ाइलों तक पहुँचने के लिए उपयोग करने से रोकता है।


1
क्या dir होने के रूप में रूट को निर्दिष्ट करने का सबसे अच्छा तरीका है?
सुपरब्यूपरड्यूपर

1
@SuperUberDuper आप की तरह मतलब है path.resolve(__dirname, '.../public')? यह स्क्रिप्ट के मूल निर्देशिका के 'सार्वजनिक' उपनिर्देशिका को हल करेगा।
mscdex

ठंडा! क्या भविष्य में यह मान __dirname में स्थायी रूप से संग्रहीत होता है?
SuperUberDuper

1
हाय, मैं निम्नलिखित की कोशिश की res.sendFile (path.resolve (__ dirname + '/index.html', '../')) लेकिन संदेश मिलता है: नहीं मिल सकता /
SuperUberDuper

2
@SuperUberDuper <- इस आदमी के पास यह अधिकार था (कम से कम मेरे लिए)। वह उस संकल्प फ़ंक्शन का उपयोग कर रहा है, जो आपको ../../<etc>टाइप सिंटैक्स के साथ नेविगेट करने की अनुमति देने वाले रास्तों को सामान्य करता है । __dirnameऔर के बीच अल्पविराम पर ध्यान दें ../public। + चिह्न का उपयोग करने से काम नहीं होता है।
हेलजेट

20

रूट पथ को जोड़ने का प्रयास करें।

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

12

, .mjs फ़ाइलों के लिए अब हमारे पास __dirname नहीं है

अत

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

यह मेरे लिए एक अच्छा उपाय है, क्योंकि मेरी आवश्यकता __dirname.So के माध्यम से रास्ता पाकर वापस जाने की थी। मैंने res.sendFile ('index.html', {root:'//public/views '}) दिया;
नीलकंठ सिंह देव

हैंडलबार्स में SITEMAP.XML के लिए, यह सही समाधान है। आपको बहुत बहुत धन्यवाद
titoih

3

यदि आप पथ पर भरोसा करते हैं, path.resolve एक विकल्प है:

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

त्रुटि बहुत सीधी है। सबसे अधिक कारण यह है कि आपकी index.html फ़ाइल रूट डायरेक्टरी में नहीं है।

या अगर यह रूट डायरेक्टरी में है तो रिलेटिव रिफरेंस काम नहीं कर रहा है।

इसलिए आपको सर्वर को अपनी फ़ाइल का सटीक स्थान बताने की आवश्यकता है। यह NodeJs में dirname पद्धति का उपयोग करके किया जा सकता है। बस इस एक के साथ अपना कोड बदलें:

 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

मैंने नीचे दिए गए कोड का उपयोग किया और साइटमैप। Xml फ़ाइल दिखाने की कोशिश की

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

फ़ाइल के स्थान को हार्डकोड करना बुरा व्यवहार है। यदि आप एक अलग मशीन में एप्लिकेशन को तैनात करते हैं तो फ़ाइल का पथ सबसे अलग होने की संभावना होगी
Merve Sahin

-3

आप अपनी निर्देशिका जैसे दोहरे स्लैश का उपयोग करने पर विचार कर सकते हैं

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

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