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

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

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

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

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

 document.write('Hello'); 

当我直接在网页浏览器(例如谷歌浏览器)上打开“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”。 但是,“你好”的消息不会出现。

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

我应该怎么做?

问题在于,无论您的浏览器请求什么,您都返回“index.html”。 所以浏览器加载你的页面,并得到的HTML。 该HTML包括您的脚本标记,并且浏览器询问节点的脚本文件。 但是,您的处理程序被设置为忽略请求的内容,所以它只是再次返回html。

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

碰巧你必须为你的请求写一个“路由器”。 下面是一个简单的方法来得到它的工作。 如果你期待www.nodebeginner.org,你会find一个方法来build立一个合适的路由器。

 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..."); 

这是一个工作代码。 应该有更简洁的代码,但这是非常接近最小的。

这段代码假设你的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); }); } 

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

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