[dodaj] Więc moim następnym problemem jest to, że kiedy próbuję dodać nową zależność (npm install --save socket.io). Plik JSON jest również prawidłowy. Pojawia się ten błąd: nie udało się przeanalizować pliku 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
Próbowałem więc dowiedzieć się, dlaczego ten błąd powraca. Wszystkie pliki (HTML, JSON, JS) znajdują się w tym samym folderze na moim pulpicie. Używam node.js i socket.io
To jest mój plik 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');
});
Oto, co jest zwracane:
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)
źródło
path.resolve(__dirname, '.../public')
? To spowoduje przejście do podkatalogu „public” katalogu nadrzędnego skryptu.../../<etc>
składni typu. Zwróć uwagę na przecinek między__dirname
a../public
. Używanie znaku + nie działa.Spróbuj dodać ścieżkę główną.
źródło
w plikach .mjs, których na razie nie mamy __dirname
W związku z tym
źródło
Jeśli ufasz ścieżce, path.resolve jest opcją:
źródło
Błąd jest dość prosty. Najprawdopodobniej przyczyną jest to, że plik index.html nie znajduje się w katalogu głównym.
Lub jeśli znajduje się w katalogu głównym, odwołanie względne nie działa.
Musisz więc podać serwerowi dokładną lokalizację pliku. Można to zrobić za pomocą metody dirname w NodeJs. Po prostu zamień swój kod na ten:
Upewnij się, że dodałeś symbol ukośnika „/” przed stroną główną. W przeciwnym razie Twoja ścieżka będzie wyglądać następująco: rootDirectoryindex.html
Podczas gdy chcesz, aby był to katalog: rootDirectory / index.html
źródło
Rozwiązuję to za pomocą zmiennej ścieżki. Przykładowy kod będzie wyglądał jak poniżej.
źródło
Jeśli pracujesz na katalogu głównym, możesz użyć tego podejścia
ale jeśli używasz tras, które są w folderze, powiedzmy,
/Routes/someRoute.js
że będziesz musiał zrobić coś takiegoźródło
W Typescript ze względną ścieżką do ikony:
źródło
Przekieruje do index.html na połączenie localhost: 8080.
źródło
Użyłem poniższego kodu i próbowałem wyświetlić plik sitemap.xml
źródło
Można to rozwiązać w inny sposób:
process.env.PWD
doda katalog roboczy na początku procesu.źródło
Zrobiłem to i teraz moja aplikacja działa poprawnie,
źródło
Możesz rozważyć użycie podwójnych ukośników w swoim katalogu, np
źródło