it-swarm.com.de

node.js TypeError: Pfad muss absolut sein oder root angeben, um res.sendFile [JSON kann nicht analysiert werden]

[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 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 

(Nicht sicher, ob dies für den Stack-Überlauf zulässig ist, bitte lassen Sie es mich wissen, falls dies nicht der Fall ist.)

Ich habe versucht herauszufinden, warum dieser Fehler zurückgegeben wurde. Alle Dateien (HTML, JSON, JS) befinden sich im selben Ordner auf meinem Desktop. Ich verwende node.js und socket.io (New-ish Webentwickler, bitte seien Sie nicht zu hart: p)

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)

Der Fehler ist ziemlich klar, Sie müssen einen absoluten (statt relativen) Pfad angeben und/oder root im Konfigurationsobjekt für res.sendFile() angeben. Beispiele:

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

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

oder einen Stamm angeben (der als Basispfad für das erste Argument von res.sendFile() verwendet wird):

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

Die Angabe des root-Pfads ist sinnvoller, wenn Sie einen vom Benutzer generierten Dateipfad übergeben, der möglicherweise fehlerhafte/schädliche Teile wie .. (z. B. ../../../../../../etc/passwd) enthalten kann. Durch das Festlegen des Pfads root wird verhindert, dass solche schädlichen Pfade für den Zugriff auf Dateien außerhalb dieses Basispfads verwendet werden.

254
mscdex

Versuchen Sie, den Stammpfad hinzuzufügen.

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

in .mjs-Dateien haben wir momentan noch kein __dirname

daher

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

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

Der Fehler ist ziemlich einfach. Der Grund ist wahrscheinlich, dass sich Ihre index.html-Datei nicht im Stammverzeichnis befindet. 

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

Sie müssen dem Server also den genauen Ort Ihrer Datei mitteilen. Dies könnte durch Verwendung der dirname-Methode in NodeJs erfolgen. Ersetzen Sie einfach Ihren Code durch diesen Code:

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

Stellen Sie sicher, dass Sie das Schrägstrichsymbol "/" vor Ihrer Startseite einfügen. Andernfalls wird Ihr Pfad zu: rootDirectoryindex.html

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

1
saadi123

Wenn Sie im Stammverzeichnis 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, sagen wir /Routes/someRoute.js, dann müssen Sie so etwas tun

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

0
M.suleman Khan

Möglicherweise sollten Sie in Ihrem Verzeichnis doppelte Schrägstriche verwenden, z

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

0
Richard Mbingi

In TypeScript mit relativem Pfad zum Symbol:

import path from 'path';

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

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

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

Ich löse das mithilfe der Pfadvariablen. Der Beispielcode sieht wie folgt aus.

var path = require("path");

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