开发者问题收集

NodeJS 错误 EADDRINUSE 和 HTML 文件未呈现,而是显示 html 代码

2016-03-24
160

我是 NodeJS 新手。现在我正在学习 NodeJS 的基本教程,到目前为止一切顺利。

但是我在使用 fs.createReadStream 方法时遇到了问题:。

var http = require("http");
var fs = require("fs");

function fourOHfour(response) {
    response.writeHead(404, {"Content-Type": "text/plain"});
    response.write("four oh four.....");
    response.end();
}

function onRequest (request, response) {
    if(request.method == 'GET' && request.url == '/'){
        response.writeHead(200, {"Content-Type": "text/plain"});
        fs.createReadStream("./index.html").pipe(response);
    }
    else{
        fourOHfour(response);
    }
}

http.createServer(onRequest).listen(8888);
console.log("server is running......");

当我在浏览器中输入 localhost:8888 时,它应该以 HTML 格式呈现 index.html 文件,但结果却错了,我得到的只是一堆 index.html 文件的代码 - 纯文本。

error localhost:8888

同时在我的 Sublime 编译器中,我没有遇到与此案例相关的任何错误。在我尝试编辑代码之前,无论我更改什么,它都会给我一个这样的错误:

error sublime compilation

如果发生这种情况,我无法修复错误,除非我重新启动笔记本电脑,然后一切恢复正常。至少我的编译器说服务器正在运行......即使我的 localhost:8888 仍然没有呈现 HTML 文件。

2个回答

您将内容类型指定为: text/plain ,这意味着页面不会以 HTML 呈现,而是以纯文本呈现。这就是您看到 HTML 文件中的“代码”而不是实际呈现的 HTML 的原因。

要解决该问题,请将内容类型设置为 text/html ,如下所示:

response.writeHeader(200, {"Content-Type": "text/html"});

关于您发布的错误,“EADDRINUSE”

EADDRINUSE 表示 listen() 尝试绑定服务器的端口号已被使用。

因此,就您而言,端口 8888 上必须已运行服务器。 像这样检查监听事件,以查看服务器是否确实在监听:

var http=require('http');

var server=http.createServer(function(req,res){
    res.end('test');
});

server.on('listening',function(){
    console.log('ok, server is running');
});

server.listen(8888);
Dayan
2016-03-24

EADDRINUSE - 似乎端口被另一个进程占用,或者可能是同一个不想关闭的 nodejs 进程占用。

尝试终止进程:

killall node

关于代码 - 尝试这个:

var http = require("http"),
    fs = require("fs"),
    URL = require('url');

function output(response, body, status) {
    status = status || 200;
    response.writeHead(status, {"Content-Type": "text/html"}); 
    response.end(body);
} 

function fourOHfour(response) {
    output(response, 404, "four oh four...");
}

function onRequest (request, response) {
    var uri = URL.parse(request.url).pathname; // extractin URI part
    var method = request.method || 'GET'; // detecting method otherwise GET

    if(method == 'GET' && uri == '/'){
        // reading file
        fs.readFile(__dirname+'/index.html', function(err, data) {
          if(err) { // if error happen, output error
            output(response, err, 500);
            return;
          }

          output(response, data); // ouput html body
        });
        return;
    }

    fourOHfour(response);
}

var httpServer = http.createServer();
    httpServer.on('request', onRequest);
    httpServer.listen(8888);

要在生产环境中运行您的代码,请在终端中执行以下操作:

  1. 永久安装:

    sudo npm install -g forever # 如果您使用 windows,或者您已经是 root 用户,请删除 sudo 字

  2. 使用 forever 启动应用程序:

    forever start app.js

要在开发环境中运行您的代码:

  1. 安装 nodemon:

    sudo npm install -g nodemon # 如果您使用 windows,或者您已经是 root,请删除 sudo 字用户

  2. 使用 nodemon 运行您的应用程序:

    nodemon app.js

永远将使您的应用程序保持运行,并将输出日志,您可以使用以下命令查看:

forever list    # lists running processes
forever logs    # shows logs that outputs forever
forever logs 0  # read logs of 0-th process

要重新启动 forever 进程:

forever restartall  # restarts all forever instances 
forever restart 0   # restarts first process 

要停止:

forever stopall
forever stop 0

关于 Nodemon:它是一个监视文件中的更改并自动重新启动的工具,无需停止-启动您的应用程序,所以这就是我更喜欢在开发环境中使用 nodemon 的原因

num8er
2016-03-24