Express-jsが静的ファイルを取得できないのはなぜですか?


308

私は自分のコードを私が作ることができる最も単純なexpress-jsアプリに減らしました:

var express = require("express"),
    app = express.createServer();
app.use(express.static(__dirname + '/styles'));
app.listen(3001);

私のディレクトリは次のようになります:

static_file.js
/styles
  default.css

しかし、アクセスするhttp://localhost:3001/styles/default.cssと次のエラーが発生します。

Cannot GET / styles /
default.css

とを使用express 2.3.3していnode 0.4.7ます。何が悪いのですか?


回答:


492

お試しくださいhttp://localhost:3001/default.css

持っているために、/stylesあなたの要求のURL、使用中:

app.use("/styles", express.static(__dirname + '/styles'));

このページの例を見てください

//Serve static content for the app from the "public" directory in the application directory.

    // GET /style.css etc
    app.use(express.static(__dirname + '/public'));

// Mount the middleware at "/static" to serve static content only when their request path is prefixed with "/static".

    // GET /static/style.css etc.
    app.use('/static', express.static(__dirname + '/public'));

42
ありがとうございました。NodeとExpressを初めて使う人にとって、Connectがミドルウェアのドキュメントがある場所であることがわかるまで、Expressのドキュメントはおおざっぱに見えます。
ネイト

4
うん。私の場合、これは欠けていたスラッシュでした。
borisdiakur 2015

私の場合、2番目の例で説明したように、マウントパスがパスに含まれていることに気付きませんでした。ありがとう!
Mike Cheel、2015

新規インストールの場合は、エクスプレスモジュールが正しくインストールされていることを確認する必要があります(expressjs.com/en/starter/installing.html)。次に、パスとGiacomoのようにディレクトリ名を確認する必要があります;)
Spl2nky

常にpath.joinクロスプラットフォームのディレクトリセパレータの問題を克服するために使用します。path.join(__ dirname、 '/')
Doug Chamberlain

35

私は同じ問題を抱えています。次のコードで問題を解決しました:

app.use('/img',express.static(path.join(__dirname, 'public/images')));
app.use('/js',express.static(path.join(__dirname, 'public/javascripts')));
app.use('/css',express.static(path.join(__dirname, 'public/stylesheets')));

静的リクエストの例:

http://pruebaexpress.lite.c9.io/js/socket.io.js

もっと簡単な解決策が必要です。存在しますか?


ソリューションが最適かどうかに関係なく、ソリューションを共有していただきありがとうございます。最適化のために問題を再度開きたい場合は、新しい状況を詳しく説明する新しい質問を投稿することを検討してください。最適化のみを目的とする場合、質問はSOコードレビューに適している可能性があります。

15

default.css で利用可能でなければなりません http://localhost:3001/default.css

stylesapp.use(express.static(__dirname + '/styles'));だけではで見て表現伝えstyles奉仕する静的ファイルのディレクトリ。それは(混乱して)それが利用可能なパスの一部を形成しません。


3
完全に!あなたはどちらにそれを行うexpress.jsで慣例である/public持っているcssjsimgあなたができるように、フォルダhttp://localhost:3001/css/default.css:)
キットSundeの

15

私にとってこの作品:

app.use('*/css',express.static('public/css'));
app.use('*/js',express.static('public/js'));
app.use('*/images',express.static('public/images'));

9

server.jsで:

var express   =     require("express");
var app       =     express();
app.use(express.static(__dirname + '/public'));

expressとappを別々に宣言し、「public」という名前のフォルダーを作成するか、必要に応じてこれらのフォルダーにアクセスできます。テンプレートsrcに、/ publicからの相対パス(または静的ファイルへのフォルダーの運命の名前)を追加しました。ルート上のバーに注意してください。


6

私のために働いたのは:

app.use(express.static(__dirname + 'public/images'));app.js に書き込む代わりに

単に書く app.use(express.static('public/images'));

つまり、パスのルートディレクトリ名を削除します。次に、他のjsファイルで静的パスを効果的に使用できます。次に例を示します。

<img src="/images/misc/background.jpg">

お役に立てれば :)


これで私の問題は解決しました。私のコードでは、CSSへのパスは__dirname連結(path.joinを使用)でも正常に機能していましたが、jsのフェッチが失敗していました。
Chim


5

アプリケーションでBootstrap CSS、JS、フォントを使用しています。assetアプリのルートディレクトリにというフォルダーを作成し、その中にすべてのフォルダーを配置しました。次に、サーバーファイルに次の行を追加しました:

app.use("/asset",express.static("asset"));

この行によりasset、次の/assetようなパス接頭辞からディレクトリにあるファイルをロードできますhttp://localhost:3000/asset/css/bootstrap.min.css

これで、ビューに次のようにCSSとJSを含めることができます。

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

5

静的ファイル(css、images、jsファイル)を提供するには、次の2つの手順を実行します。

  1. cssファイルのディレクトリを組み込みミドルウェアexpress.staticに渡します

    var express = require('express');
    var app = express();
    /*public is folder in my project directory contains three folders
    css,image,js
    */
    //css  =>folder contains css file
    //image=>folder contains images
    //js   =>folder contains javascript files
    app.use(express.static( 'public/css'));
  2. CSSファイルまたは画像にアクセスするには、URL http:// localhost:port / filename.css ex:http:// localhost:8081 / bootstrap.cssを入力するだけです

注意: CSSファイルをHTMLにリンクするには、次のように入力します<link href="file_name.css" rel="stylesheet">

このコードを書くと

var express = require('express');
var app = express();
app.use('/css',express.static( 'public/css'));

静的ファイルにアクセスするには、url:localhost:port / css / filename.css ex:http:// localhost:8081 / css / bootstrap.cssと入力します。

cssファイルをhtmlにリンクすることに注意して、次の行を追加してください

<link href="css/file_name.css" rel="stylesheet">    

3

これは私のために働いた

app.use(express.static(path.join(__dirname, 'public')));

app.use('/img',express.static(path.join(__dirname, 'public/images')));

app.use('/shopping-cart/javascripts',express.static(path.join(__dirname, 'public/javascripts')));

app.use('/shopping-cart/stylesheets',express.static(path.join(__dirname, 'public/stylesheets')));

app.use('/user/stylesheets',express.static(path.join(__dirname, 'public/stylesheets')));

app.use('/user/javascripts',express.static(path.join(__dirname, 'public/javascripts')));


1

私のcssファイルを見つけて、それにルートを追加します。

app.get('/css/MyCSS.css', function(req, res){
  res.sendFile(__dirname + '/public/css/MyCSS.css');
});

その後、動作するようです。


ExpressJS .use()express.static()メソッドを使用してファイルを提供する場所を送信する必要があるため、このアプローチはお勧めしません。それ以外の場合は、パブリックディレクトリのファイルごとにこれらのルーターの1つがあり、維持するのに多くのオーバーヘッドがあります。
Sgnl

これは回避策ですが、適切だとは思いません。CSSおよびJSファイルが多数ある場合、どのようにしてそれを維持できますか?
arsho 2017年

0

上記に加えて、静的ファイルのパスが/(ex ... / assets / css)...で始まることを確認してください。メインディレクトリ(/ main)の上のディレクトリにある静的ファイルを提供します。


2
上記に加えて?回答にそれを明記してください(必要に応じて、投稿した人にクレジットを記入してください)。最初のいくつかではなく、すべての回答が表示されるように、SOは多くの場合、回答の順序を変更します。私たちはあなたが何について話しているのか分かりません。
Zachary Kniebel 2013

0

あなたのセットアップなら

myApp
  |
  |__ public
  |     |
  |     |__  stylesheets
  |     |     |
  |     |     |__ style.css
  |     |
  |     |___ img
  |           |
  |           |__ logo.png
  |
  |__ app.js

次に、
app.js に入れます

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

そしてあなたのstyle.cssを参照してください:(いくつかの.pugファイルで):

link(rel='stylesheet', href='/static/stylesheets/style.css')

名前を変更するステップpublic-> staticを導入するのはなぜですか?私はそれがもっと混乱する追加情報だと思います。しかし、その後、再び間接は、通常は良いことですが...
masterxilo

0
  1. Nodejsプロジェクト
    フォルダーに「公開」名のフォルダーを作成します。
  2. Nodejsプロジェクトフォルダーにindex.htmlファイルを配置します。
  3. すべてのスクリプトとcssファイルをパブリックフォルダーに配置します。
  4. 使用する app.use( express.static('public'));

  5. そして中 index.html に、スクリプトの正しいパス<script type="text/javascript" src="/javasrc/example.js"></script>

そして今、すべてがうまくいきます。


0

静的ディレクトリ

上の画像(静的ディレクトリ)のdir構造を確認してください

const publicDirectoryPath = path.join(__dirname,'../public')
app.use(express.static(publicDirectoryPath))


//  or

app.use("/", express.static(publicDirectoryPath))
app.use((req, res, next) => {
res.sendFile(path.join(publicDirectoryPath,'index.html'))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.