Response.write()不返回值
我一直在关注这个教程来介绍nodejs,但是我在使用response.write()方法返回时遇到了麻烦。
我的server.js代码工作正常,当我去域:8001返回“你好世界”,但导航到域:8001 / socket.html返回一个黑屏。
我已经使用console.log来检查编写“套接字在这里”的代码。 正在执行,但我不知道为什么它没有做任何事情。
server.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; console.log(__dirname); console.log(path); 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){ if (error){ response.writeHead(404); response.write("opps this doesn't exist - 404"); } else{ response.writeHead(200, {"Content-Type": "text/html"}); response.write("socket is here."); } }); break; default: response.writeHead(404); response.write("opps this doesn't exist - 404"); break; } response.end(); }); server.listen(8001); var io = require('socket.io').listen(server);
socket.html :(虽然它不应该包含在其中)
<html> <head> <script src="/socket.io/socket.io.js"></script> </head> <body> <script> var socket = io.connect(); </script> <div>This is our socket.html file</div> </body> </html>
在等待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; console.log(__dirname); console.log(path); 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){ if (error){ response.writeHead(404); response.write("opps this doesn't exist - 404"); } else{ response.writeHead(200, {"Content-Type": "text/html"}); response.write("socket is here."); } response.end(); }); return; default: response.writeHead(404); response.write("opps this doesn't exist - 404"); break; } response.end(); }); server.listen(8001); var io = require('socket.io').listen(server);
另外,做fs.readFile(__dirname + path, ...);
是有潜在危险的,因为有人可以发送/../../../../../../etc/passwd
这样的请求。 你应该做什么,而不是使用path
模块来解决/规范化__dirname + path
到一个绝对path,然后确保该绝对path以您的公共目录的绝对path开始。