res.sendFile絶対パス


137

私がするなら

res.sendfile('public/index1.html'); 

その後、サーバーコンソールの警告が表示されます

express deprecated res.sendfileres.sendFile代わりに使用

しかし、クライアント側では問題なく機能します。

しかし、私がそれを

res.sendFile('public/index1.html');

エラーが出る

TypeError:パスは絶対パスであるか、ルートを指定する必要があります res.sendFile

およびindex1.htmlレンダリングされていません。

絶対パスが何なのか理解できません。とpublic同じレベルのディレクトリがありますserver.jsres.sendFileからをやっていserver.jsます。私も宣言しましたapp.use(express.static(path.join(__dirname, 'public')));

私のディレクトリ構造を追加:

/Users/sj/test/
....app/
........models/
....public/
........index1.html

ここで指定する絶対パスは何ですか?

Express 4.xを使用しています。


express.staticミドルウェアを使用して公開ディレクトリを提供している場合、なぜres.sendFile送信する必要があるのpublic/index1.htmlですか?
マイクS

1
オンデマンドで送信するようにres.sendFile内部app.get('/', function(req, res){res.sendFile("...")})から呼び出しています。
カヤトースト2014

回答:


310

express.staticミドルウェアは別にあるres.sendFileあなたへの絶対パスでそれを初期化するので、publicディレクトリに何もしませんres.sendFile。で絶対パスを直接使用する必要がありますres.sendFile。それには、2つの簡単な方法があります。

  1. res.sendFile(path.join(__dirname, '../public', 'index1.html'));
  2. res.sendFile('index1.html', { root: path.join(__dirname, '../public') });

注: __dirname現在実行中のスクリプトがあるディレクトリを返します。あなたの場合、server.jsisのように見えますapp/。したがって、に到達するにはpublic、最初に1レベル戻す必要があります../public/index1.html

注: pathrequire、上記のコードを機能させるためにdにする必要がある組み込みモジュールです。var path = require('path');


14
res.sendFile('../public/index.html', {root: __dirname});また、機能し、短くなります
Fabien Sa

エクスプレスおよびウェブストームideでの作業:エラーは発生せずconsole.log(path.join(__dirname, '../public', 'index.html'));res.sendFile(path.join(__dirname, '../public', 'index.html'));作業のみ var path = require('path');
Quake1TF 2017

sendFileで使用できるように絶対パスを事前定義する方法はありませんか?
eran otzap

4
res.sendFile('../public/index.html', {root: __dirname});ルートの上に移動したため403 Forbiddenを返すため、(もう)機能しません。res.sendFile('public/index.html', {root: path.dirname(__dirname)});代わりにしてください。
Trevor Robinson

48

代わりにこれを試してください:

res.sendFile('public/index1.html' , { root : __dirname});

これでうまくいきました。root:__ dirnameは、server.jsが上記の例にあるアドレスを取得し、index1.html(この場合)に到達するために、返されるパスは、パブリックフォルダーが存在するディレクトリに到達することです。


このオプションが文書化されていないのはなぜですか?
timkay

9
res.sendFile( __dirname + "/public/" + "index1.html" );

__dirname、現在実行中のスクリプト(server.js)が存在するディレクトリの名前を管理します。


この解決策は非常に簡単でした。助けてくれてありがとう。
3

3
@TheThirdを使用pathすると、OSに依存しなくなります。
kmonsoor

7

まだ記載されていない代替案はpath.resolve、個別の文字列を使用するか、パス全体を使用するだけです。

// comma separated
app.get('/', function(req, res) {
    res.sendFile( path.resolve('src', 'app', 'index.html') );
});

または

// just one string with the path
app.get('/', function(req, res) {
    res.sendFile( path.resolve('src/app/index.html') );
});

(ノードv6.10.0)

https://stackoverflow.com/a/14594282/6189078からのアイデア


6

他の回答に基づいて、これは最も一般的な要件を達成する方法の簡単な例です:

const app = express()
app.use(express.static('public')) // relative path of client-side code
app.get('*', function(req, res) {
    res.sendFile('index.html', { root: __dirname })
})
app.listen(process.env.PORT)

これは、リクエストごとにindex.htmlで応答する簡単な方法としても*機能します。これは、静的(パブリック)ディレクトリーで見つからなかったすべてのファイルをスターで使用しているためです。これは、Webアプリの最も一般的な使用例です。/ルートパスのインデックスのみを返すように変更します。


いいね。素敵で簡潔。
lharby

5

私はこれを試してみましたが、うまくいきました。

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


3

より少ないコードを書くことでこれを行う別の方法。

app.use(express.static('public'));

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

5
これにより、「TypeError:パスは絶対パスであるか、res.sendFileへのルートを指定する必要があります」
GreenAsJade

1

sendFileの代わりにsendを使用できるため、エラーに直面することはありません!この作品はあなたを助けます!

fs.readFile('public/index1.html',(err,data)=>{
if(err){
  consol.log(err);
}else {
res.setHeader('Content-Type', 'application/pdf');

あなたの応答がPDFのタイプであることをブラウザに伝えるため

res.setHeader('Content-Disposition', 'attachment; filename='your_file_name_for_client.pdf');

ユーザーがファイルをダウンロードした後すぐに同じページでそのファイルを開く場合は、上記のコードの添付ファイルではなく「インライン」に書き込みます。

res.send(data)

0

これを一度設定してどこでも使用したい場合は、独自のミドルウェアを構成してください。アプリを設定するときは、次を使用して応答オブジェクトに新しい関数を定義します。

app.use((req, res, next) => {
  res.show = (name) => {
    res.sendFile(`/public/${name}`, {root: __dirname});
  };
  next();
});

次に、次のように使用します。

app.get('/demo', (req, res) => {
  res.show("index1.html");
});

0

Node.Jsを使用して同じ問題が発生しました...すべてのスクリプトの先頭に '/'を追加するだけで解決し、CSS静的ファイルにリンクしました。

前:

<link rel="stylesheet" href="assets/css/bootstrap/bootstrap.min.css">

後:

<link rel="stylesheet" href="/assets/css/bootstrap/bootstrap.min.css">

これを機能させるには、エクスプレススタティックサーバーを設定する必要があります
Hum4n01d
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.