【问题标题】:Server is running on 8080, but browser says webpage is unavailable服务器在 8080 上运行,但浏览器显示网页不可用
【发布时间】:2015-10-29 08:15:48
【问题描述】:

我遵循了本教程 (http://www.hongkiat.com/blog/node-js-server-side-javascript/),当运行倒数第二个脚本(用于创建静态服务器)时,命令提示符显示“服务器在端口 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");

【问题讨论】:

    标签: javascript node.js localhost server port


    【解决方案1】:

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

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

    可怕的情况是:

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

    所以这里学到的教训是:

    • 原子地做事
    • 总是立即处理故障

    只要你坚持这个原则,就不需要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);
    

    我还删除了那些“二进制”东西,它们已经过时了,也没有在 API 中记录!

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

    【讨论】:

    • 感谢您的帮助和建议,运行此代码只会给我 404,所以现在的挑战就是让页面显示,谢谢您的帮助
    • 把测试页和脚本放在同一目录下;假设您的测试页面名为“hi.txt”并包含“At laaaaaaast ... :)”;然后调用 localhost:8080/hi.txt
    猜你喜欢
    • 2020-01-20
    • 2016-12-21
    • 2017-11-01
    • 1970-01-01
    • 2012-10-08
    • 2011-04-26
    • 2019-03-10
    • 1970-01-01
    • 2019-09-07
    相关资源
    最近更新 更多