javascript - 이란 - res render json




node.js TypeError:경로가 절대이거나 res.sendFile에 루트를 지정해야합니다 (4)

[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를 사용하고 있습니다 (New-ish 웹 개발자입니다. 너무 가혹하지 마십시오.) p)

이것은 내 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)

.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 파일이 루트 디렉토리에 있지 않기 때문일 수 있습니다.

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

따라서 서버에 파일의 정확한 위치를 알려줘야합니다. 이는 NodeJs에서 dirname 메소드를 사용하여 수행 할 수 있습니다. 코드를 다음 코드로 바꿉니다.

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

홈페이지 앞에 슬래시 '/'기호를 추가했는지 확인하십시오. 그렇지 않으면 경로가 rootDirectoryindex.html이됩니다.

원하는 경우 : rootDirectory / index.html


오류는 매우 명확합니다. res.sendFile() 의 config 객체에 절대 경로 (상대 경로 대신)를 지정하거나 root 를 설정해야합니다. 예 :

// 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 와 같이 조작 된 / 악의적 인 부분을 포함 할 수있는 사용자 생성 파일 경로를 전달할 때 유용합니다 .. ../../../../../../etc/passwd ). root 경로를 설정하면 이러한 악성 경로가 해당 기본 경로 외부의 파일에 액세스하는 것을 막을 수 있습니다.







dependencies