服务器在 8080 运行,但浏览器显示网页不可用

Server is running on 8080, but browser says webpage is unavailable

我遵循了本教程 (http://www.hongkiat.com/blog/node-js-server-side-javascript/),当 运行 倒数第二个脚本(用于创建静态服务器)时,命令提示符显示 "Server running on port 8080",但是在尝试访问时它在 localhost:8080 我刚收到网页不可用错误。

我在防火墙里做了一个规则,也允许访问 8080。

这可能是什么原因造成的?我应该尝试从另一个地址访问该页面吗?

当我尝试访问该页面时,我在 cmd 中收到以下错误消息:

C:\Users\id122302\Documents\test.js:11
        path.exists(full_path,function(exists)
             ^
TypeError: undefined is not a function
    at Server.<anonymous> (C:\Users\id122302\Documents\test.js:11:7)
    at Server.emit (events.js:110:17)
    at HTTPParser.parserOnIncoming [as onIncoming] (_http_server.js:491:12)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:111:23)
    at Socket.socketOnData (_http_server.js:343:22)
    at Socket.emit (events.js:107:17)
    at readableAddChunk (_stream_readable.js:163:16)
    at Socket.Readable.push (_stream_readable.js:126:10)
    at TCP.onread (net.js:538:20)

这是我的代码:

var sys = require("sys");
my_http = require("http");
path = require("path");
url = require("url");
filesys = require("fs");
//Create Server
my_http.createServer(function(request,response)
{
 var my_path = url.parse(request.url).pathname;
 var full_path = path.join(process.cwd(),my_path);
 path.exists(full_path,function(exists)
 {
  if (!exists)
  {
   response.writeHeader(404, {"Content-Type":"text/plain"});
   response.write("404 Not Found\n");
   response.end();
  }
  else
  {
   filesys.readFile(full_path, "binary", function(err,file)
   {
    if (err)
    {
     response.writeHeader(500,{"Content-Type":"text/plain"});
     response.write(err + "\n");
     response.end();
    }
    else
    {
     response.writeHeader(200);
     response.write(file,"binary");
     response.end();
    }
   });
  }
 });
}).listen(8080);
console.log("Server Running on 8080");

您的服务器显示异常和行号 => 去那个地方!

正如@maniacnero 所观察到的,API 中不再有 path.exists 这样的东西。有一个 fs.exists 但它已被弃用,以避免在节点的并发上下文中滥用。

可怕的情况是:

  • 你异步检查文件是否存在。
  • 与此同时,其他一些例程 deletes/renames 它,或者服务器上的其他东西。
  • 您认为该文件存在,因此您尝试打开它并自信地不处理错误情况。

所以这里的经验教训是:

  • 原子地做事
  • 总是立即处理失败

只要你坚持这个纪律,就不需要fs.exists。这是您的代码的修改版本:

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


var port = 8080;


http.createServer(function(request,response) {
    var my_path = url.parse(request.url).pathname;
    var full_path = path.join(process.cwd(),my_path);
    fs.readFile(full_path, function(err, file) {
        if (err) {
            response.writeHeader(404, {"Content-Type":"text/plain"});
            response.write("404 Not Found\n");
            response.end();
        } else {
            response.writeHeader(200);
            response.write(file);
            response.end();
        }
    });
}).listen(port);

console.log("Server Running on " + port);

我还删除了那些 "binary" 东西,它们已经过时并且 API 中也没有记录!

尝试示例代码是一种很好的学习方式,但前提是您不要盲目地这样做。 ;) 尤其是在一种建立在快速变化的 API 之上的弱类型语言中,并且无数的教程都是由完全的初学者编写的。这是你的朋友:https://nodejs.org/api/