web-dev-qa-db-ja.com

node.js TypeError:パスは絶対パスであるか、res.sendFileにrootを指定する必要があります[JSONの解析に失敗しました]

[追加]だから私の次の問題は、私が新しい依存関係を追加しようとしたときです(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)

エラーは非常に明白です、あなたは絶対パスを指定するか相対パスではなくres.sendFile()の設定オブジェクトに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)。 rootパスを設定すると、そのような悪質なパスがそのベースパスの外側のファイルにアクセスするために使用されるのを防ぎます。

272
mscdex

ルートパスを追加してみてください。

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

今のところ.mjsファイルには__dirnameがありません

それゆえ

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

パスを信頼している場合は、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'));
    });
2
Michael Cole

エラーはかなり簡単です。最も可能性が高いのは、index.htmlファイルがルートディレクトリにないことです。

または、それがルートディレクトリにある場合は、相対参照は機能していません。

それであなたはあなたのファイルの正確な位置をサーバーに伝える必要があります。これは、NodeJでdirnameメソッドを使用して実行できます。コードをこれに置き換えてください。

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

あなたがあなたのホームページの前にスラッシュ "/"記号を追加することを確認してください。それ以外の場合、パスは次のようになります。rootDirectoryindex.html

RootDirectory/index.htmlにします。

1
saadi123

あなたがルートディレクトリで作業しているなら、あなたはこのアプローチを使うことができます

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

0
M.suleman Khan

ディレクトリに二重スラッシュを使用することを検討するかもしれません。

app.get('/',(req,res)=>{
    res.sendFile('C:\\Users\\DOREEN\\Desktop\\Fitness Finder' + '/index.html')
})
0
Richard Mbingi

アイコンへの相対パスを持つTypeScriptの場合:

import path from 'path';

route.get('/favicon.ico', (_req, res) => res.sendFile(path.join(__dirname, '../static/myicon.png')));
0
David Dehghan

それはlocalhost:8080呼び出しでindex.htmlにリダイレクトします。

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

パス変数を使用してこれを解決します。サンプルコードは以下のようになります。

var path = require("path");

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