11

私はnode.jsとjavascriptの初心者です。

HTML コードに外部の JavaScript ファイルを含めたい。これがhtmlコード「index.html」です。

<script src="simple.js"></script>

そして、ここに JavaScript コード「simple.js」があります。

document.write('Hello');

「index.html」を Web ブラウザ (Google Chrome など) で直接開くと、動作します。(「Hello」メッセージが画面に表示されるはずです。)

しかし、node.js http サーバー経由で「index.html」を開こうとすると、うまくいきません。これが node.js ファイル「app.js」です。

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

app.listen(8000);

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

    res.writeHead(200);
    res.end(data);
  });
}

("index.html"、"simple.js"、"app.js" は同じディレクトリにあります。) http サーバーを起動しました。(by "bash$node app.js") その後、"localhost:8000" に接続してみました。しかし、「Hello」メッセージは表示されません。

「index.html」は、http サーバーに「simple.js」を含めることができなかったと思います。

どうすればいいですか?

4

5 に答える 5

22

アレクサンドルは正しい。彼の答えをもっと明確にしようと思います。

リクエストに対して「ルーター」を作成する必要がある場合があります。以下は、それを機能させる簡単な方法です。www.nodebeginner.orgを楽しみにすると、適切なルーターを構築する方法が見つかります。

var fs = require("fs");
var http = require("http");
var url = require("url");

http.createServer(function (request, response) {

    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");

    response.writeHead(200);

    if(pathname == "/") {
        html = fs.readFileSync("index.html", "utf8");
        response.write(html);
    } else if (pathname == "/script.js") {
        script = fs.readFileSync("script.js", "utf8");
        response.write(script);
    }


    response.end();
}).listen(8888);

console.log("Listening to server on 8888...");
于 2014-02-18T22:24:25.733 に答える
8

問題は、ブラウザが何を要求しても、「index.html」を返すことです。そのため、ブラウザはページをロードして html を取得します。その html にはスクリプト タグが含まれており、ブラウザはノードにスクリプト ファイルを要求します。ただし、ハンドラーはリクエストの目的を無視するように設定されているため、html をもう一度返すだけです。

于 2013-07-18T11:42:27.853 に答える
3

ここに作業コードがあります。もっとクリーンでシンプルなコードがあるはずですが、これは最小限に非常に近いものです。

このコードは、index.html およびその他のファイルが /client dir の下にあると想定しています。

幸運を。

var fs = require('fs');
var url = require("url");
var path = require('path');
var mime = require('mime');

var log = console.log; 

var handler = function (req, res)
{
    var dir = "/client";
    var uri = url.parse(req.url).pathname;
    if (uri == "/")
    {
        uri = "index.html";
    }
    var filename = path.join(dir, uri);
    log(filename);
    log(mime.lookup(filename));
    fs.readFile(__dirname + filename,
        function (err, data)
        {
            if (err)
            {
                res.writeHead(500);
                return res.end('Error loading index.html');
            }
            log(data);
            log(filename + " has read");
            res.setHeader('content-type', mime.lookup(filename));
            res.writeHead(200);
            res.end(data);
        });
}
于 2013-07-18T11:54:40.543 に答える
1

ハンドラーは、常に のコンテンツを返すようにハードコードされてい/index.htmlます。要求されているリソースに注意を払い、正しいリソースを返す必要があります。(つまり、ブラウザが要求する場合は、代わりにsimple.jsそれを指定する必要があります)。simple.jsindex.html

于 2013-07-18T11:40:45.613 に答える