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