如何在node.js的客户端包含javascript?

时间:2013-07-18 11:38:53

标签: javascript node.js

我是node.js和javascript的初学者。

我想在html代码中包含外部javascript文件。这是html代码,“index.html”:

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

而且,这是javascript代码,“simple.js”:

document.write('Hello');

当我直接在网络浏览器(例如Google Chrome)上打开“index.html”时,它可以运行。 (屏幕上应显示“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服务器。 (通过“bash $ node app.js”) 之后,我尝试连接“localhost:8000”。 但是,“Hello”消息不会出现。

我认为“index.html”未能在http服务器上包含“simple.js”。

我该怎么办?

5 个答案:

答案 0 :(得分:20)

Alxandr是对的。我会尽力澄清他的答案。

碰巧你必须为你的请求写一个“路由器”。下面是一个让它工作的简单方法。如果您期待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...");

答案 1 :(得分:8)

问题是你的浏览器请求的是什么,你返回“index.html”。因此,浏览器加载您的页面并获取HTML。该html包含您的脚本标记,浏览器会向节点请求脚本文件。但是,您的处理程序设置为忽略请求的内容,因此它只会再次返回html。

答案 2 :(得分:3)

这是一个有效的代码。 应该有更清晰更简单的代码,但这非常接近最小。

此代码假设您的index.html和其他文件位于/ client目录下。

祝你好运。

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);
        });
}

答案 3 :(得分:1)

您的处理程序是硬编码的,始终返回/index.html的内容。您需要注意所请求的资源并返回正确的资源。 (即如果浏览器要求simple.js,那么您需要提供simple.js而不是index.html)。

答案 4 :(得分:1)

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 PATH = 'C:/Users/DELL P26E/node_modules'
    var http = require("http");
    var fs = require('fs');
    var url = require("url");
    var path = require("path")
    var fileName = "D:/index.html";

    var server = http.createServer (function (request, response) {




        var dir = "D:/";
        var uri = url.parse(request.url).pathname;
        if (uri == "/")
        {
            uri = "index.html";
        }
        var filename = path.join(dir, uri);



        fs.readFile( filename,
            function (err, data)
            {
                console.log(err)
                if (err)
                {
                    response.writeHead(500);
                    return response.end('Error loading index.html');
                }

                var ext = path.extname(filename)
                response.setHeader('content-type',contentType(ext));
                response.writeHead(200);
                response.end(data);
            });


    }).listen(3000);

    console.log('Server running on 8124') ;