Response.write() 或 .toString()(错误?)在 NodeJS 服务器上

Response.write() or .toString() (bug?) on NodeJS server

我正在尝试制作一个小型网络服务器进行测试。我用 NodeJS 做到了。但是意想不到的事情发生了。 NodeJS 服务器传过来的网页无法正常显示。但是当我使用 php+Apache 时,该网页运行良好。当我打开客户端收到的源代码时,没有明显的区别。这是我的代码:

Server.js

var http = require('http');
var fs = require('fs');
var url = require('url');
var Max = 30;
var port = process.argv[2];

var server = http.createServer( function (request, response) {
    var pathname = url.parse(request.url).pathname; if (pathname == "") pathname = "index.html";
    console.log("Request for " + pathname + " received.");
    fs.readFile(pathname.substr(1), function (err, data) {
            if (err) {
                    console.log(err);
                    response.writeHead(404, {'Content-Type': 'text/html'});
            } else {
                    response.writeHead(200, {'Content-Type': 'text/html'});
                    response.write(data.toString());
            }
            response.end();
    });
}).listen(port);

console.log('Server running at http://127.0.0.1:8081/');


var sockets = {}, nextSocketId = 0;
server.on('connection', function (socket) {
    var socketId = nextSocketId++;
    sockets[socketId] = socket;
    console.log('socket', socketId, 'opened');

    socket.on('close', function () {
            console.log('socket', socketId, 'closed');
            delete sockets[socketId];
    });

    socket.setTimeout(4000);
});

function anyOpen(array) {
    for (var ele in array) {
            if (ele) return true;
    }
    return false;
}


(function countDown (counter) {
    console.log(counter);
    if (anyOpen(sockets)) {
            return setTimeout(countDown, 1000, Max);
    } else if (counter > 0 ) {
            return setTimeout(countDown, 1000, counter - 1);
    };
    server.close(function () { console.log('Server closed!'); });
    for (var socketId in sockets) {
            console.log('socket', socketId, 'destroyed');
            sockets[socketId].destroy();
    }
})(Max);

Chatroom2-0.php

<!DOCTYPE html> 
<html>
<head>
<style>
    textarea {
            width:95%;
            rows:50;
            height:80%;
    }
</style>
<script     src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js">    </script>
<script type="text/javascript">

    var str = "";
    function enter(e){
            if (e.keyCode == 13 && document.getElementById("Input").value) {
                    //alert("Enter!!!!");
                    sendInput();
                    document.getElementById("Input").value = "";
            }
    };

    function updateBoard() {
            xmlhttp = new XMLHttpRequest();

            xmlhttp.onreadystatechange = function() {
                    if ( xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                            document.getElementById("MsgBoard").innerHTML = xmlhttp.responseText;
                    }
                    var textarea = document.getElementById('Output');
                    textarea.scrollTop = textarea.scrollHeight;  
            };

            xmlhttp.open("POST","Server.php",true);
            xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                xmlhttp.send("Type=Username&Content="+document.getElementById("Username").value);
    };

    function sendInput() {
            username = document.getElementById("Username").value; if (!username) username = "Gotemptyname";
            msg = document.getElementById("Input").value; if (!msg) msg = "GotNothing";
            if (msg) {
                    xmlhttp = new XMLHttpRequest();
                    xmlhttp.open("POST","Server.php",true);
                    //xmlhttp.open("POST","test.txt",true);
                    //xmlhttp.send();
                    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");                  
                    xmlhttp.send("Type=Message&Username="+username+"&Content="+msg);
                    //alert(xmlhttp.responseText);
            }
    };

</script>
</head>
<body onload="setInterval('updateBoard()',1000)">
<div id="MsgBoard"></div>
<form name="UsrInput">
<?php
    if (isset($_POST["Username"]))
            echo '<input type="text" id ="Username" value="'.$_POST["Username"].'" disable>';
    else {
            header("Location: /login/index.html");
            die();
    }
?>
<input type="text" id="Input" onkeypress="enter(event)"  value="" >
</form>
</body>
</html> 

用户登录后应该可以访问聊天室2-0.php。登录功能也可以。但是当我进入 Chatroom2-0.php 时,我在我的文本框旁边得到了一个字符串。

'; else { header("Location: /login/index.html"); die(); } ?>

我注意到该字符串是我在文件中的 php 代码的一部分。我不知道发生了什么。我认为这可能与 response.write() 或 data.toString() 函数有关。也许这个函数改变了我的编码?我该如何解决这个问题。

无论如何,我感谢您提供的任何帮助。

问题是您正在尝试 运行 php nodejs 服务器上的代码。对此没有解决方案,因为节点不是 php 解释器,所以它将所有内容视为 html 文本;因此您的 php 代码出现在页面上。您需要为节点项目创建一个完全不同的 html。