web-dev-qa-db-ja.com

学習Node-エクスプレスパブリックフォルダーが機能しない

だから私はノードに慣れていないので、expressライブラリを使用する方法を学ぼうとしています。ただし、私が理解しようとしている問題は、_/public_フォルダー内のファイルが静的コンテンツとして提供されていないように見える理由です。

私のコードは次のとおりです。

_var http = require('http');
var port = process.env.port || 1337;
var express = require('express');
var handlebars = require('express3-handlebars');
var path = require('path');

var application = express();

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

application.engine('handlebars', handlebars({ defaultLayout: 'main' }));

application.get('/', function(req, res){
    res.render('index.handlebars', { someProp: 3 });
});

application.listen(port);
_

そして私のディレクトリ構造:

_/
  - server.js (the above referenced file)
  / Views
    - index.handlebars
    / Layouts
      - main.handlebars
  / public
    - ServeMe.txt
_

私の理解では、application.use(express.static(path.join(__dirname, 'public')));は、見つかった場合、そのリソースを使用してパブリックフォルダーの下のすべての要求に応答するようにサーバーを構成することになっています。私は何を間違えていますか?面白いことに、ハンドルバーをビューエンジンとして構成する方が、このパブリックフォルダーを機能させるよりも簡単でした= D

編集:私が要求しようとしている完全なURL:_http://localhost:1337/public/serveme.txt_

大文字と小文字の区別(これは問題ではないはずです)を試しましたが、それもうまくいきませんでした。

21
Tejs

要求しようとしている完全なURL:http://localhost:1337/public/serveme.txt

それはあなたの問題だ。静的コンテンツとして指定したディレクトリ内のすべてのものは、ベースURLから直接利用可能になります。代わりにhttp://localhost:1337/serveme.txtを要求する必要があります。

/publicの静的ファイルのみを提供する場合は、文字列を最初の引数として渡すことができます。

application.use("/public", express.static(path.join(__dirname, 'public')));
35
James Allardice

Express APIリファレンス から

app.use(express.static(__dirname + '/public'));

この行は、アプリのルートURLでパブリックフォルダーを提供します。つまり、次のリクエストは有効であり、404エラーは発生しません。

// GET /javascripts/jquery.js // GET /style.css // GET /favicon.ico

app.useはオプションの最初の引数も取ります。これにより、コンテンツを提供するリクエストURLを指定できます。この最初の引数のデフォルトは「/」です。つまり、静的コンテンツはベースURLで提供されます。現在のコードのように、ルートレベルではなく静的コンテンツを提供したい場合は、次の例を確認してください(再びドキュメントから引用)

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

この行は再びパブリックフォルダーを提供しますが、アプリの/ static URLで次のリクエストを404エラーなしで有効にします。

(URLの例:http://localhost:1337/static/anythingInYourPublicFolder

// GET /static/javascripts/jquery.js // GET /static/style.css // GET /static/favicon.ico

21
Dylan Kirkby

どのURLをロードしようとしていますか? not URLに「public」を含める必要があるため、curl -v 'http://localhost:1337/ServeMe.txt'

2
Peter Lyons