2016-12-31 7 views
0

以下のクライアントコードでは、index.jsおよびindex.htmlと同じディレクトリにあるイメージ(space.jpg)を表示しようとしています。サーバーにアクセスしてindex.htmlを提供すると、画像に壊れたリンクが表示されています。私がここで考慮していない静的なHTMLを提供しているときに、Nodeのネイティブファイル構造について何かありますか?NodeJSを使用したファイルパスの問題

OS X(10.10.5)のローカル環境でテストしています。

I持って、次のサーバコード(index.js):

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 

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

io.on('connection', function(socket){ 
    console.log('a user connected'); 

    socket.on('chat message', function(msg){ 
     console.log('message: ' + msg); 
     io.emit('chat message', msg); 
    }); 

    socket.on('disconnect', function(){ 
    console.log('user disconnected'); 
    }); 

}); 

http.listen(3000, function(){ 
    console.log('listening on *:3000'); 
}); 

そして、次のクライアントコード(index.htmlを):

ブラウザが space.jpgを要求しようとしたときためです
<!doctype html> 
<html> 
    <head> 
    <title>Infinium</title> 
    <style> 

    </style> 
    </head> 
    <body> 
     <div id="chat" style="background-color:rgba(0,0,0,0.7);width:500px;top:0px;left:0px;position:absolute;"> 
    <div style="width:500px;px;height:100px;overflow-y:auto;color:#FFFFFF" id="messages"></div> 
     <form action=""> 
     <input id="m" autocomplete="off" /><button>Send</button> 
    </form> 
     </div> 
     <img src="space.jpg"> 

     <script src="/socket.io/socket.io.js"></script> 
<script src="http://code.jquery.com/jquery-1.11.1.js"></script> 
<script> 
    var socket = io(); 

    $('form').submit(function(){ 
    socket.emit('chat message', $('#m').val()); 
    $('#m').val(''); 
    return false; 
    }); 

    socket.on('chat message', function(msg){ 
    $('#messages').append($('<li>').text(msg)); 
    var element = document.getElementById("messages"); 
    element.scrollTop = element.scrollHeight; 
    }); 
</script> 
    </body> 
</html> 
+0

コンソールログにエラーメッセージが記録されましたか?それは何を言いますか? –

+0

エクスプレスサーバーが画像ファイルを提供しないという問題がありますか?質問からチャットクライアントコードをすべて削除してください。それは無駄な混乱です。フォーカス。 – Tomalak

+0

@EliezerWohlありがとうございます。GET http:// localhost:3000/space.jpg 404(見つからない) – nicktendo

答えて

3

index.htmlにサービスする/のリスナーを作成しただけなので、サーバーは何も応答しません。あなたのコードにこれを追加する必要がありますあなたの画像を送信するために

app.get('/space.jpg', function(req, res) { 
    res.sendfile('./space.jpg'); 
}); 

代替はexpress.staticを使用することになり、静的コンテンツ(例えば画像)が含まれ、特定のパスのためにそれを設定します。これにより、ファイルに従って処理されます。

+0

ありがとうございました:) – nicktendo

4

あなたはindex.htmlファイルを提供していますが、node.jsコードに静的ファイルサービス機能を設定していません。

node-staticexpress-staticのように、このためのいくつかのNPMパッケージがあります。これをミドルウェアとして使用することができます。そして、あなたがミドルウェアとして明示静電気を使用するようにindex.jsを編集することができ

$ npm install express-static --save

こととして、プロジェクトでこれらのいずれかをインストールします。これにより、プロジェクトルートの/ public下にあるすべてのファイルが処理されます。したがって、すべてのアセット、つまり画像、CSS、クライアントサイドのjsをパブリックディレクトリ内に配置できます。

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 

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

生産では、Node.jsの大きなリソースファイルとの良好ではないので、静的なファイルを提供するために前向きのhttpサーバを使用するか、またはnginxのまたはapacheののようにプロキシを逆にすることをお勧めします。

関連する問題