web-dev-qa-db-fra.com

node.js TypeError: le chemin doit être absolu ou indiquer la racine à res.sendFile [impossible d'analyser JSON]

[add] Donc, mon problème suivant est que lorsque j'essaie d'ajouter une nouvelle dépendance (npm install --save socket.io). Le fichier JSON est également valide. Je reçois cette erreur: Impossible d’analyser 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 

(Je ne sais pas si cela est autorisé sur le débordement de pile, quelqu'un s'il vous plaît laissez-moi savoir si ce n'est pas le cas)

J'ai donc essayé de comprendre pourquoi cette erreur revenait. Tous les fichiers (HTML, JSON, JS) se trouvent dans le même dossier sur mon bureau. J'utilise node.js et socket.io (Nouveau développeur Web, ne soyez pas trop dur: p)

Ceci est mon fichier 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');
});

C'est ce qui est retourné:

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)
112

L'erreur est assez claire, vous devez spécifier un chemin absolu (au lieu de relatif) et/ou définir root dans l'objet de configuration pour res.sendFile(). Exemples:

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

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

ou spécifiez une racine (utilisée comme chemin de base pour le premier argument de res.sendFile():

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

Spécifier le chemin root est plus utile lorsque vous transmettez un chemin de fichier généré par l'utilisateur qui pourrait potentiellement contenir des parties mal formées/malveillantes telles que .. (par exemple ../../../../../../etc/passwd). La définition du chemin root empêche l'utilisation de tels chemins malveillants pour accéder à des fichiers situés en dehors de ce chemin de base.

254
mscdex

Essayez d'ajouter le chemin racine.

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

dans les fichiers .mjs, nous n'avons pour l'instant pas __dirname

par conséquent

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

Si vous faites confiance au chemin, path.resolve est une 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

L'erreur est assez simple. La raison la plus probable est que votre fichier index.html ne se trouve pas dans le répertoire racine. 

Ou s'il se trouve dans le répertoire racine, le référencement relatif ne fonctionne pas. 

Vous devez donc indiquer au serveur l'emplacement exact de votre fichier. Cela peut être fait en utilisant la méthode dirname dans NodeJs. Il suffit de remplacer votre code par celui-ci:

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

Assurez-vous que vous ajoutez le symbole barre oblique "/" avant votre page d'accueil. Sinon, votre chemin deviendra: rootDirectoryindex.html

Alors que vous voulez que ce soit: rootDirectory/index.html

1
saadi123

Si vous travaillez sur le répertoire racine, vous pouvez utiliser cette approche.

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

mais si vous utilisez Routes qui se trouve dans un dossier, disons /Routes/someRoute.js, vous devrez faire quelque chose comme ceci.

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

0
M.suleman Khan

Vous pourriez envisager d’utiliser des doubles barres obliques sur votre répertoire, par exemple

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

0
Richard Mbingi

Dans TypeScript avec un chemin relatif à l’icône:

import path from 'path';

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

Il redirigera vers index.html sur localhost: appel 8080.

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

Je résous cela en utilisant la variable de chemin. L'exemple de code ressemblera à celui ci-dessous.

var path = require("path");

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