我是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”。
我该怎么办?
答案 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') ;