我的第一个Node.js服务器:无法加载资源:net :: ERR_INCOMPLETE_CHUNKED_ENCODING

以下服务器应该是:

情况#1:如果请求是http://localhost:8080则服务mysitename.html

CASE#2:如果请求是http://localhost:8080/mysitename.html则提供相关文件

如果请求是http://localhost:8080/contactform?name=..&..&...etc. CASE#3会向我发送电子邮件http://localhost:8080/contactform?name=..&..&...etc.

如果我访问http://localhost:8080/mysitename.html一切工作正常。 mysitename.html被加载,然后通过它加载所有后续的内容(.js,.css,.png等)。

问题:但是,如果我访问http://localhost:8080 ,则会发生以下情况:

  • 我在浏览器的(Chrome)控制台上得到一个无法加载资源:net :: ERR_INCOMPLETE_CHUNKED_ENCODING错误。
  • `mysitename.html'在客户端上出现损坏。 DOM的一部分丢失,当我尝试查看源页面时,它只是挂起,实际上并没有加载。 只加载DOM的一部分是奇怪的,因为这个文件的所有DOM元素都是静态的/硬编码的。
  • 令人困惑的是,其他内容(.js,.css等)被加载,但没有任何实际显示,因为损坏.html。 CASE#1是否被后面的CASE#2中断? 我究竟做错了什么?

CASE#2最初有一个错误,导致Johnny Estilles发现一个无限循环(见下面的答案)。 现在已经解决了这个问题,但是现在出现了上述问题。

server.js

 // setting up email handler var nodemailer = require('nodemailer'); var emailHandlerService = 'Gmail'; var emailHandlerAddress = ******; var emailHandlerPassword = ******; var transporter = nodemailer.createTransport({ service: emailHandlerService, auth: { user: emailHandlerAddress, pass: emailHandlerPassword } }); // setting up http server var http = require('http'); var fs = require('fs'); var url = require("url"); var path = require("path"); var rootDir = __dirname + "/public"; var mimeTypes = { "html": "text/html", "jpeg": "image/jpeg", "jpg": "image/jpeg", "png": "image/png", /* Even though the js mime type is set as well, scripts are still sent as "text/plain" according to the Chrome console. Why is that ? */ "js": "application/javascript", "css": "text/css", "ico": "image/ico" }; // initializing server var httpServer = http.createServer(function (request, response) { // CASE #1 // if the user is on http://localhost:8080, load public/mysitename.html if (request.url === "/") { fs.readFile('public/mysitename.html', function (err, html) { if (err) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.write('404 Not Found\n'); throw (err); } else { response.writeHeader(200, {"Content-Type": "text/html"}); response.write(html); } }); } // CASE #2 // else if this is a contact form data request // forward the data to my email (I'll make a more precise Regex for the request) else if (/contactform/.test(request.url)) { var parsedURL = url.parse(request.url, true); var name = parsedURL.query.name; var email = parsedURL.query.email; var subject = parsedURL.query.subject; var enquiry = parsedURL.query.enquiry; var browser = parsedURL.query.browsername + " " + parsedURL.query.browserversion; transporter.sendMail({ from: emailHandlerAddress, to: emailHandlerAddress, subject: subject, text: "|| NAME = " + name + " || EMAIL = " + email + " || BROWSER = " + browser + " || DEVICE = " + parsedURL.query.device + " || ENQUIRY = " + enquiry }); response.end(JSON.stringify(parsedURL.query)); } // CASE #3 // if none of the above is true then this is a request to serve static files else { var pathname = url.parse(request.url).pathname; var filename = path.join(rootDir, pathname); fs.exists(filename, function (exists) { if (!exists) { fs.readFile('public/404.html', function (err, html) { if (err) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.write('404 Not Found\n'); throw (err); } else { response.writeHeader(200, {"Content-Type": "text/html"}); response.write(html); } response.end(); }); } else { var requestedFileExtension = path.extname(filename).split(".")[1]; var mimeType = mimeTypes[requestedFileExtension] || 'text/plain'; // as I noted above, this doesn't seem to have any effect // for my .js files response.writeHead(200, mimeType); var fileStream = fs.createReadStream(filename); fileStream.pipe(response); } }); } }).listen(8080); 

固定的问题#1:无限循环

你在最初的if()缺less一个等号(或两个if()

更改

 if (request.url = "/") 

 if (request.url == "/") or if (request.url === "/") 

修复问题#2: Failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODING

您在CASE#1中缺lessresponse.end()

 // CASE #1 // if the user is on http://localhost:8080, load public/mysitename.html if (request.url === "/") { fs.readFile('public/mysitename.html', function (err, html) { if (err) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.write('404 Not Found\n'); throw (err); } else { response.writeHeader(200, {"Content-Type": "text/html"}); response.write(html); } response.end(); // <-- MISSING }); }