簡體   English   中英

簡單的node.js服務器不會錯誤處理失敗的請求

[英]simple node.js server not error handling failed request

我用以下代碼設置了一個簡單的node.js服務器:

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

var server = http.createServer(function(request, response){
    console.log('Connection');
    var path = url.parse(request.url).pathname;

    switch(path) {
        case '/':
            response.writeHead(200, {'Content-Type': 'text/html'});
            response.write('hello world');
            break;
        case '/socket.html':
            fs.readFile(__dirname + path, function(error, data){
                console.log(path);
                console.log(error);
                if (error){
                    response.writeHead(404);
                    response.write("opps this doesn't exist - 404");
                }
                else{
                    response.writeHead(200, {"Content-Type": "text/html"});
                    response.write(data, "utf8");
                }
            });
            break;
        default:
            response.writeHead(404);
            response.write("opps this doesn't exist - 404");
            break;
    }
    response.end();
});

server.listen(8001);

連接到localhost:8001可以正常工作。

但是,當我嘗試連接到localhost:8001 / socket.html時,服務器崩潰,終端顯示以下錯誤:

events.js:141 throw er; //未處理的“錯誤”事件^

錯誤:寫在FSReqWrap.readFileAfterClose處的/Users/Nikos/Desktop/hack_reactor/server.js:24:34處的ServerResponse.OutgoingMessage.write(_http_outgoing.js:428:15)結束時[不完整](fs.js: 380:3)

調試時,console.log(error)返回null。 請解釋為什么會這樣。

您的代碼中的問題是fs.readFile是異步函數,因此response.end在response.write之前運行。 在response.end之后,連接被關閉,您不能再寫了。 解決方案很簡單。 完成編寫后,只需調用response.end即可。

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

var server = http.createServer(function(request, response){
    console.log('Connection');
    var path = url.parse(request.url).pathname;

    switch(path) {
        case '/':
            response.writeHead(200, {'Content-Type': 'text/html'});
            response.write('hello world');
            response.end();
            break;
        case '/socket.html':
            fs.readFile(__dirname + path, function(error, data){
                console.log(path);
                console.log(error);
                if (error){
                    response.writeHead(404);
                    response.write("opps this doesn't exist - 404");
                    response.end();
                }
                else{
                    response.writeHead(200, {"Content-Type": "text/html"});
                    response.write(data, "utf8");
                    response.end();
                }
            });
            break;
        default:
            response.writeHead(404);
            response.write("opps this doesn't exist - 404");
            response.end();
            break;
    }
});

server.listen(8001);

來自異步的問題com。 READFILE您發送response.end()結束前fs.readFile

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

var server = http.createServer(function(request, response){
    console.log('Connection');
    var path = url.parse(request.url).pathname;

    switch(path) {
        case '/':
            response.writeHead(200, {'Content-Type': 'text/html'});
            response.write('hello world');
            break;
        case '/socket.html':
            fs.readFile(__dirname + path, function(error, data){//<-----------+
                console.log(path);//                                          |
                console.log(error);//                                         |
                if (error){//                                                 |
                    response.writeHead(404);//                                |
                    response.write("opps this doesn't exist - 404");//        |
                }//                                                           |
                else{//                                                       |
                    response.writeHead(200, {"Content-Type": "text/html"});// |
                    response.write(data, "utf8");//                           |
                }//                                                           |
            });//                                                             |
            break;//                                                          |
        default://                                                            |
            response.writeHead(404);//                                        |
            response.write("opps this doesn't exist - 404");//                |
            break;//                                                          |
    }//                                                                       |
    response.end();//<--------------------------This Happen before the end of |--^ | fs.readFile
});

server.listen(8001);

這樣嘗試

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

var server = http.createServer(function(request, response){
    console.log('Connection');
    var path = url.parse(request.url).pathname;

    switch(path) {
        case '/':
            response.writeHead(200, {'Content-Type': 'text/html'});
            response.write('hello world');
            response.end();
            break;
        case '/socket.html':
            fs.readFile(__dirname + path, function(error, data){
                console.log(path);
                console.log(error);
                if (error){
                    response.writeHead(404);
                    response.write("opps this doesn't exist - 404");
                    response.end();
                }
                else{
                    response.writeHead(200, {"Content-Type": "text/html"});
                    response.write(data, "utf8");
                    response.end();
                }
            });
            break;
        default:
            response.writeHead(404);
            response.write("opps this doesn't exist - 404");
            response.end();
            break;
    }
});

server.listen(8001);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM