4

私はsocket.ioが初めてで、すでに問題を抱えています。マイナーだと思います。node.js を適切にインストールし、socket.io も npm でインストールしました。次に、テストのために、socket.io からコードのサンプルをカット アンド ペーストすると、すべてがうまく機能します。ここで、コードとフォルダーを構造化したいので、フォルダー「クライアント」を作成して、例のクライアントコードを含む新しいjsファイルclient.jsを配置しました。これが私のアーキテクチャです

/client
    client.js
index.html 
server.js

client.js :

var socket = io.connect('http://localhost:80');
  socket.on('news', function (data) {
    alert('sqd');
    console.log(data);
    socket.emit('my other event', { my: 'data' });
});

サーバー.js

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')

app.listen(80);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html', 'utf-8',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html ' + __dirname);
    }

    res.writeHead(200, {'Content-Type' : 'text/html'});
    res.end(data);
  });
}

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

index.html

<!doctype html>
<html>
  <head>

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

    <title></title>

    <script type="text/javascript" src="/client/client.js"></script>
    <script type="text/javascript" src="/socket.io/socket.io.js"></script>

  </head>
  <body>
  </body>
</html>

localhost:80 でブラウザを更新すると、client.js にエラーが表示されます。

Uncaught SyntaxError: Unexpected token <
Resource interpreted as Script but transferred with MIME type text/html

私の js ファイルを js ファイルとして解釈するのに問題があるようです。質問に関するいくつかのスレッドを読みましたが、何も機能しません。

私を助けてくれませんか?

ありがとう:)


わかりました解決策を見つけました... 静的 Web サーバーでファイル要求ごとにコンテンツ タイプを指定する必要があります。誰かを助けることができるかもしれません。ハンドラー関数は次のとおりです。

function handler (req, res) {

  var filePath = req.url;

  if (filePath == '/') {
      filePath = './client/index.html';
  } else {
      filePath = './client/lib' + req.url;
  }

  var extname = path.extname(filePath);
  var contentType = 'text/html';

  switch (extname) {
    case '.js':
        contentType = 'text/javascript';
        break;
    case '.css':
        contentType = 'text/css';
        break;
  }

  path.exists(filePath, function(exists) {

    if (exists) {
        fs.readFile(filePath, function(error, content) {
            if (error) {
                res.writeHead(500);
                res.end();
            }
            else {
                res.writeHead(200, { 'Content-Type': contentType });
                res.end(content, 'utf-8');
            }
        });
    }
    else {
        res.writeHead(404);
        res.end();
    }
  });
}

これが誰かを助けることを願っています。私は問題を投稿し、助けを借りずに自分で対応するのが大好きです。どういうわけか、私はあまりにも速く必死になっていることを意味します. そして、私も投稿で自分の人生を語るのが大好きです:) OK、何か食べて、コーヒーをもっと飲むつもりです!!!

4

5 に答える 5

3

どうもありがとう!これは私の問題を解決しました!! そして、スイッチを次のコードに変更しました。

var extname = path.extname(filePath);
var contentTypesByExtention = {
  'html': 'text/html',
  'js':   'text/javascript',
  'css':  'text/css'
};
var contentType = contentTypesByExtention[extname] || 'text/plain';

維持するのは簡単かもしれません:)

于 2012-08-08T13:04:46.670 に答える
0

それだけが必要!ありがとう!1行のコード行を一番上に追加します

サーバー.js

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')
  **, path = require('path')**
于 2013-05-07T22:31:55.490 に答える
0

また、クロージャーでラップする必要がありfs.readFileます。そうしないと、一部のファイル (特に最後のファイル) が複数回読み取られ、他のファイルはまったく読み取られません。そして、contentTypeあなたが望むように設定されません。これは、 で使用されるコールバック戦略が原因ですfs.readFile。htmlファイルが1つの外部ファイルをロードするだけでは問題は発生しませんが、外部ファイル(css、js、png)が複数ロードされると、上記で指摘したように表示されます。(これは自分で思いつきました)

したがって、コードは次のように少し変更する必要があります。

;(function (filename, contentType) {

    fs.readFile(filename, function(err, file) {
        // do the left stuff here
    });

}(filename, contentType)); 
于 2015-01-13T07:27:26.623 に答える
0

mimeモジュールも使用できます。

var mime = require('mime')
  , content_type = mime.lookup(filePath);

// handle the request here ...

response.setHeader('Content-Type', content_type);
response.writeHead(200);
response.end(data);
于 2013-07-06T19:08:41.303 に答える