2016-07-25 12 views
3

何らかの理由でnode.jsに単純なアプリケーションを作成していますが、「TypeError:パスは絶対値でなければならない」または「res.sendFileにrootを指定する」私のHTMLページを提供しようとしています。このエラーは、このファイルが見つかる可能性のあるフォルダを指定する明示的なミドルウェアを使用しているため発生しません。だから私はなぜこの問題を抱えているのですか?Node.jsアプリケーションがルートパスなしの静的なWebページを提供していない

マイアプリの構造は、私が「res.sendFileを行うことができますが、私のhtmlページは、私はこれを回避するために知っているこの

var express = require("express"); 
var app = express(); 

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

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

app.listen(3000); 

ようapp.jsで提供されている。この

MyApp 
    public 
     login.html 
    app.js 

のように見えます(__dirname + '/public/login.html'); "代わりにミドルウェアを使用しているので、私はする必要はありません。何か案は?

+0

これはやや混乱します。 'sendFile()'にファイル名を指定すると、Nodeは "public"フォルダを参照する必要がありますか?そうではありません。直接アクセスすると静的なファイルだけが読み込まれますので、名前は "静的"です。 – adeneo

+0

お使いのOSは? –

+0

@adeneoはい、login.htmlが静的なのでパブリックフォルダを見ることを期待しています – OneMoreQuestion

答えて

0

このライン

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

は、あなたはそれがないと思う何をしません!

それはではありません。は、すべてのノード機能のデフォルトフォルダを設定します。実際には、他のノード機能では何も行いません。

ウェブサーバーがリクエストを受信した場合、そのファイルが存在するかどうかを確認し、存在する場合はそのファイルを表示します。

したがって、CSSやJavaScriptファイルでよく使用される静的ファイルのルートです。もちろん、動的コンテンツを提供しないその他の静的ファイルもあります。

しかし、このライン

res.sendFile("login.html"); 

は、現在の作業ディレクトリ内のファイルlogin.htmlを探しますか、ノードのスクリプトが実行されている他の言葉で、それがで行うには全く何も持っていませんスタティックルートは、実際には関係なく、あなたのスクリプトが実行されているのファイルを取得するための正しい方法は、そのファイルを見つけるためにsendFileために必要な正しいパス、であるよう

res.sendFile(__dirname + '/public/login.html'); 

を行うには、正確です。

+0

待機はlogin.htmlは静的なファイルではないことを確認しますか? – OneMoreQuestion

+0

@OneMoreQuestion - あなたが 'http:// mywebsite/login.html'のようにアクセスすれば、静的な**ルート**でそれを取得することもできますが、' sendFile'は突然動作しませんウェブサーバ*のために設定された静的ルート。つまり、静的ルートはNode内の他の関数とは何の関係もなく、Webサーバーのみが静的ファイルをブラウザに提供することができます。 – adeneo

+0

あなたは "sendFile"がミドルウェアを使用したいと思っているという正しいアプローチではないと言っています。私は "レンダリング"も試みましたが、その後ビューエンジンレンダリングの問題にぶつかりました。ミドルウェアを利用したい場合、より良い方法がありますか? – OneMoreQuestion

0

さんはその後$

var $=(file)=>`${__dirname}/public/${file}`; 

この関数を呼び出してみましょう、あなたの完全なパスを与える機能を追加します。そのことによって

res.sendFile($("login.html")); 

、あなたが各sendFileのために手動でルートパスを含める必要はありません。コール。

関連する問題