4

シンプルなhtmlファイルを読み取るノードを持つhttpサーバーを作成しています。この html ファイルは、コンピューターにあるいくつかのスクリプトをインポートします。ノードはこのスクリプトをロードできません。なんで?

    var http = require('http');
var io = require('socket.io').listen(2210);
var fs = require('fs');

http.createServer(function(req, res){
    fs.readFile("./index.html", function(err, data){
        if (err){
            res.writeHead(500);
            res.end("Error loading index.html");
        }
            res.writeHead(200, {"Content-Type":"text/html"});
            res.end(data, 'utf-8');
    });
}).listen(2211);

io.sockets.on('connection', function(socket){

});

そして、ここにhtmlファイルがあります:

<!DOCTYPE html> 
<html> 
    <head> 
    <title>ASGEAWER</title> 
  <meta name="viewport" content="width=device-width, minimum-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="jquery-mobile/jquery.mobile.css" />
    <link rel="stylesheet" href="jquery.mobile.splitview.css" />
  <link rel="stylesheet"  href="jquery.mobile.grids.collapsible.css" />
  <script type="text/javascript" src="jquery-1.7.1.js"></script>
  <script type="text/javascript" src="jquery.mobile.splitview.js"></script>
  <script type="text/javascript" src="jquery.mobile.js"></script>
  <script type="text/javascript" src="servernode.js"></script>
  <script type="text/javascript" src="interaction.js"></script>
  <script type="text/javascript">
    $(document).on("ready",inici);
  </script>
</head> 

  <body> 

    <div data-role="panel" data-id="menu" data-hash="crumbs" data-context="a#default">

      <!-- Start of first page -->
      <div data-role="page" id="main" data-hash="false">

        <div data-role="header" data-position="fixed">
            <h1>Categoria</h1>
        </div><!-- /header -->

        <div data-role="content">
          <ul data-role="listview">

          </ul>
        </div>

      </div><!-- /page -->

    </div><!-- panel menu -->






    <div data-role="panel" data-id="main">
      <!-- Start of 6th page -->
      <div data-role="page" id="aboutsv">

        <div data-role="header" data-theme="b">
          <h1>Productos</h1>
        </div><!-- /header -->

        <div data-role="content"> 
        </div><!-- /content -->
      </div><!-- /page -->

    </div><!-- panel main -->


  </body>
</html>

そしてクロムは私にそれらのエラーを与えます:

Uncaught SyntaxError: Unexpected token < jquery-1.7.1.js:1
Uncaught SyntaxError: Unexpected token < jquery.mobile.splitview.js:1
Uncaught SyntaxError: Unexpected token < jquery.mobile.js:1
Uncaught SyntaxError: Unexpected token < servernode.js:1
Uncaught SyntaxError: Unexpected token < interaction.js:1
Uncaught ReferenceError: $ is not defined 
4

1 に答える 1

7

この html ファイルは、コンピューターにあるいくつかのスクリプトをインポートします

src 属性を持つタグを見つけたときにブラウザーが行うことは、<script>そのファイルを要求するサーバー (この場合はノードの http サーバー) に別の要求を行うことです。

あなたの場合、サーバーは index.html コンテンツで各リクエストに応答します。

したがって、そのファイルをインポートするには、常に index.html コンテンツで応答するのではなく、そのファイルのコンテンツですべての静的ファイル要求に応答するように http.createServer コールバックを変更する必要があります。

次のようになります。

まず、コンテンツ タイプを処理する関数を作成します。

function contentType(ext) {
    var ct;

    switch (ext) {
    case '.html':
        ct = 'text/html';
        break;
    case '.css':
        ct = 'text/css';
        break;
    case '.js':
        ct = 'text/javascript';
        break;
    default:
        ct = 'text/plain';
        break;
    }

    return {'Content-Type': ct};
}

次に、サーバー コードを再定義します。

var http = require('http'),
    fs = require('fs'),
    path = require('path');

var HTTP_OK = 200,
    HTTP_ERR_UNKNOWN = 500,
    HTTP_ERR_NOT_FOUND = 404;

http.createServer(function (req, res) {
    var filepath = '.' + (req.url == '/' ? index : req.url),
        fileext = path.extname(filepath); 

    path.exists(filepath, function (f) {
        if (f) {
            fs.readFile(filepath, function (err, content) {
                if (err) {
                    res.writeHead(HTTP_ERR_UNKNOWN);
                    res.end();
                } else {
                    res.writeHead(HTTP_OK, contentType(fileext));
                    res.end(content);
                }
            });
        } else {
            res.writeHead(HTTP_ERR_NOT_FOUND);
            res.end();
        }
    });
});

これは単純な自家製の静的サーバーですが、これにライブラリを使用するとより効果的です。

于 2012-12-23T15:45:11.653 に答える