[javascript] node.js TypeError : 경로는 절대적이거나 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)



답변

오류는 매우 분명합니다. 상대 경로 대신 절대 경로를 지정하거나 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경로를 설정 하면 이러한 악성 경로가 해당 기본 경로 외부의 파일에 액세스하는 데 사용되지 않습니다.


답변

루트 경로를 추가하십시오.

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


답변

.mjs 파일에는 현재 __dirname이 없습니다.

그 후

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


답변

경로를 신뢰하는 경우 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'));
    });


답변

오류는 매우 간단합니다. 대부분의 이유는 index.html 파일이 루트 디렉토리에 없기 때문입니다.

또는 루트 디렉토리에 있으면 상대 참조가 작동하지 않습니다.

따라서 서버에게 파일의 정확한 위치를 알려 주어야합니다. NodeJ에서 dirname 메소드를 사용하여 수행 할 수 있습니다. 코드를 다음과 같이 바꾸십시오.

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

홈페이지 앞에 슬래시 “/”기호를 추가해야합니다. 그렇지 않으면 경로는 rootDirectoryindex.html이됩니다.

원하는 경우 : rootDirectory / index.html


답변

경로 변수를 사용 하여이 문제를 해결합니다. 샘플 코드는 다음과 같습니다.

var path = require("path");

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


답변

루트 디렉토리에서 작업하는 경우이 방법을 사용할 수 있습니다

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

그러나 폴더 안에있는 경로를 사용하는 경우 /Routes/someRoute.js다음과 같이 말해야 합니다.

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