NodeJS 错误 EADDRINUSE 和 HTML 文件未呈现,而是显示 html 代码
我是 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
文件的代码 - 纯文本。
同时在我的 Sublime 编译器中,我没有遇到与此案例相关的任何错误。在我尝试编辑代码之前,无论我更改什么,它都会给我一个这样的错误:
如果发生这种情况,我无法修复错误,除非我重新启动笔记本电脑,然后一切恢复正常。至少我的编译器说服务器正在运行......即使我的
localhost:8888
仍然没有呈现 HTML 文件。
您将内容类型指定为:
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);
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);
要在生产环境中运行您的代码,请在终端中执行以下操作:
-
永久安装:
sudo npm install -g forever # 如果您使用 windows,或者您已经是 root 用户,请删除 sudo 字
-
使用 forever 启动应用程序:
forever start app.js
要在开发环境中运行您的代码:
-
安装 nodemon:
sudo npm install -g nodemon # 如果您使用 windows,或者您已经是 root,请删除 sudo 字用户
-
使用 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 的原因