web-dev-qa-db-ja.com

res.sendFileの絶対パス

私がするなら

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

それから私はサーバーコンソールの警告を受けます

廃止予定のres.sendfileを表現する:代わりにres.sendFileを使用する

しかし、それはクライアント側ではうまく機能します。

しかし、私はそれをに変更すると

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

エラーが出ます

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

index1.htmlはレンダリングされません。

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

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

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

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

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

113
Kaya Toast

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.jsapp/内にあるように見えます。そのため、publicを取得するには、最初に1つのレベルを取り消す必要があります。../public/index1.html

注:pathは組み込みモジュール であり、そのためにはrequiredが必要です。上記のコードが機能するように:var path = require('path');

263
Mike S

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

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

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

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

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

8
SOuřaan Gřg

まだリストにされていない私にとって有効な代替案は、単に別々の文字列でpath.resolveを使うか、または完全なパスでただ1つを使うことです:

// 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
Phil Gibbins

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

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

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

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アプリの最も一般的なユースケースです。ルートパスのインデックスのみを返すには、/に変更します。

3
Jaime Gómez

より少ないコードを書くことによってこれをするもう一つの方法。

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

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

process.cwd()はプロジェクトの絶対パスを返します。

その後:

res.sendFile( `${process.cwd()}/public/index1.html` );
2
Abdennour TOUMI

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
Aref.T

一度これを設定してどこでもそれを使用したい場合は、単にあなた自身のミドルウェアを設定してください。アプリを設定するときには、次のようにしてレスポンスオブジェクトに新しい関数を定義します。

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
danp

私はNode.Jsを使用して同じ問題を抱えていました…私はすべてのスクリプトの先頭に '/'を追加してcss静的ファイルにリンクするだけで解決しました。

前:

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

後:

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