Node.js TypeError: путь должен быть абсолютным или указать root для res.sendFile [не удалось разобрать JSON]

[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) находятся в одной папке на моем рабочем столе. Я использую node.js и socket.io

Это мой файл 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)

Ответ 1

Ошибка довольно ясна, вам нужно указать абсолютный (вместо относительного) путь и/или установить 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 предотвращает использование таких вредоносных путей для доступа к файлам за пределами этого базового пути.

Ответ 2

Попробуйте добавить корневой путь.

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

Ответ 3

В файлах .mjs у нас пока нет __dirname

следовательно,

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

Ответ 4

Если вы доверяете пути, 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'));
    });

Ответ 5

Ошибка довольно проста. Скорее всего, причина в том, что ваш файл index.html отсутствует в корневом каталоге.

Или, если он находится в корневом каталоге, относительная ссылка не работает.

Итак, вам нужно сообщить серверу точное местоположение вашего файла. Это можно сделать, используя метод dirname в NodeJs. Просто замените свой код на этот:

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

Убедитесь, что перед вашей домашней страницей добавлен символ "/". В противном случае ваш путь станет следующим: rootDirectoryindex.html

В то время как вы хотите, чтобы это было: rootDirectory/index.html

Ответ 6

Я решаю это с помощью переменной пути. Пример кода будет выглядеть ниже.

var path = require("path");

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

Ответ 7

Если вы работаете с корневым каталогом, то вы можете использовать этот подход

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

но если вы используете Routes, который находится внутри папки, скажем /Routes/someRoute.js то вам нужно будет сделать что-то вроде этого

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

Ответ 8

В Typescript с относительным путем к значку:

import path from 'path';

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

Ответ 9

Он будет перенаправлять в index.html при вызове localhost: 8080.

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

Ответ 10

Это можно решить по-другому:

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

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

});

process.env.PWD добавит рабочий каталог при запуске процесса.

Ответ 11

Вы можете рассмотреть возможность использования двойной косой черты в вашем каталоге, например

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