1. ホーム
  2. javascript

[解決済み】node.js TypeError: path must be absolute or specify root to res.sendFile [JSONのパースに失敗しました]。

2022-01-18 23:11:54

質問

追加 そこで次の問題は、新しい依存関係を追加しようとしたとき(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 のパスは、そのような悪意のあるパスが、そのベースパスの外側のファイルにアクセスするために使用されるのを防ぎます。