node.js TypeError: Pfad muss absolut sein oder root für res.sendFile angeben [JSON konnte nicht analysiert werden]


150

[add] Mein nächstes Problem ist also, wenn ich versuche, eine neue Abhängigkeit hinzuzufügen (npm install --save socket.io). Die JSON-Datei ist ebenfalls gültig. Ich erhalte die folgende Fehlermeldung: json konnte nicht analysiert werden

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 

Also habe ich versucht herauszufinden, warum dieser Fehler zurückgekehrt ist. Alle Dateien (HTML, JSON, JS) befinden sich auf meinem Desktop im selben Ordner. Ich benutze node.js und socket.io

Dies ist meine JS-Datei:

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

Folgendes wird zurückgegeben:

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)

Antworten:


331

Der Fehler ist ziemlich klar, Sie müssen einen absoluten (anstelle eines relativen) Pfades angeben und / oder rootim Konfigurationsobjekt für festlegen res.sendFile(). Beispiele:

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

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

oder geben Sie eine Wurzel an (die als Basispfad für das erste Argument verwendet wird, um res.sendFile():

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

Das Angeben des rootPfads ist nützlicher, wenn Sie einen vom Benutzer generierten Dateipfad übergeben, der möglicherweise fehlerhafte / böswillige Teile wie ..(z ../../../../../../etc/passwd. B. ) enthalten kann. Durch das Festlegen des rootPfads wird verhindert, dass solche schädlichen Pfade für den Zugriff auf Dateien außerhalb dieses Basispfads verwendet werden.


1
Was ist der beste Weg, um die Wurzel als ein Verzeichnis anzugeben?
SuperUberDuper

1
@ SuperUberDuper Du meinst wie path.resolve(__dirname, '.../public')? Dadurch wird das Unterverzeichnis 'public' des übergeordneten Verzeichnisses des Skripts aufgelöst.
mscdex

cool! speichert dies diesen Wert in Zukunft dauerhaft in __dirname?
SuperUberDuper

1
Hallo, ich habe die folgende res.sendFile (path.resolve (__ dirname + '/index.html', '../')) ausprobiert, aber die Meldung erhalten: Kann /
SuperUberDuper nicht erhalten

2
@ SuperUberDuper <- dieser Typ hatte es richtig (zumindest für mich). Er verwendet die Auflösungsfunktion, die die Pfade normalisiert, sodass Sie mit der Typensyntax navigieren können ../../<etc>. Beachten Sie das Komma zwischen __dirnameund ../public. Die Verwendung eines + -Zeichens funktioniert nicht.
Helzgate

20

Versuchen Sie, den Root-Pfad hinzuzufügen.

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

12

In .mjs-Dateien haben wir derzeit keinen __dirname

daher

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

Dies ist eine gute Lösung, die für mich funktioniert hat, da ich nach dem Erhalten des Pfads durch __dirname zurückkehren musste. Also gab ich res.sendFile ('index.html', {root: './public/views'});
Nilakantha Singh Deo

Für SITEMAP.XML im Lenker ist dies die richtige Lösung. Vielen Dank
bis

3

Wenn Sie dem Pfad vertrauen, ist path.resolve eine Option:

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

Der Fehler ist ziemlich einfach. Der Grund ist höchstwahrscheinlich, dass sich Ihre Datei index.html nicht im Stammverzeichnis befindet.

Oder wenn es sich im Stammverzeichnis befindet, funktioniert die relative Referenzierung nicht.

Sie müssen dem Server also den genauen Speicherort Ihrer Datei mitteilen. Dies kann mithilfe der dirname-Methode in NodeJs erfolgen. Ersetzen Sie einfach Ihren Code durch diesen:

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

Stellen Sie sicher, dass Sie vor Ihrer Homepage den Schrägstrich "/" einfügen. Andernfalls lautet Ihr Pfad: rootDirectoryindex.html

Während Sie möchten, dass es ist: rootDirectory / index.html


1

Ich löse dies mit der Pfadvariablen. Der Beispielcode sieht wie folgt aus.

var path = require("path");

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

0

Wenn Sie an Root Directory arbeiten, können Sie diesen Ansatz verwenden

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

Wenn Sie jedoch Routen verwenden, die sich in einem Ordner befinden, müssen /Routes/someRoute.jsSie beispielsweise Folgendes tun

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

0

In Typoskript mit relativem Pfad zum Symbol:

import path from 'path';

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

0

Beim Aufruf von localhost: 8080 wird auf index.html umgeleitet.

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

0

Ich habe den folgenden Code verwendet und versucht, die Datei sitemap.xml anzuzeigen

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

-1

Dies kann auf andere Weise gelöst werden:

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

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

});

process.env.PWD wird dem Arbeitsverzeichnis vorangestellt, als der Prozess gestartet wurde.


-2

Ich habe das getan und jetzt funktioniert meine App richtig.

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

Es ist eine schlechte Praxis, den Speicherort der Datei fest zu codieren. Wenn Sie die Anwendung auf einem anderen Computer bereitstellen, ist der Pfad der Datei höchstwahrscheinlich anders
Merve Sahin,

-3

Sie können doppelte Schrägstriche in Ihrem Verzeichnis verwenden, z

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.