// 引用模块(与C#中命名空间,Java中引用包同理) var http = require("http"); var path = require("path"); var fs = require("fs"); var url = require("url"); // 封装路由函数 function Root(visit_path,request,response){ var pathObj = url.parse(request.url,true); // 获取请求路径,解析为url对象 var filePath = path.join(visit_path,pathObj.pathname); // 拼接目录路径和请求路径,组合成完整访问路径 var fileContent = fs.readFileSync(filePath,'binary'); // 读取目标路径下的文件,以二进制读取(binary) response.write(fileContent,'binary'); // 将解析的文件以二进制(binary)方式发送 response.end(); } http.createServer((request,response) => { Root(path.join(__dirname,'view'),request,response); // __dirname是nodejs内置变量,用来获取当前文件所在的路径 }).listen(8080,'127.0.0.1'); console.log("success !");
使用readFileSync以同步的方式读取,同步方式读取文件,若遇到请求路径下没有文件,服务器就会直接挂掉。
// 引用模块(与C#中命名空间,Java中引用包同理) var http = require("http"); var path = require("path"); var fs = require("fs"); var url = require("url"); // 封装路由函数 function Root(visit_path,request,response){ var pathObj = url.parse(request.url,true); // 获取请求路径,解析为url对象 var filePath = path.join(visit_path,pathObj.pathname); // 拼接目录路径和请求路径,组合成完整访问路径 /** * 一般服务器路由使用readFile异步方式去读文件 * 这样可以根据返回的错误信息做不同处理 */ fs.readFile(filePath,'binary',(err,fileContent) => { if(err){ response.writeHead(404,'not found'); response.end('<h1>404 未找到页面</h1>'); }else{ response.write(fileContent,'binary'); response.end(); } }); } http.createServer((request,response) => { Root(path.join(__dirname,'view'),request,response); // __dirname是nodejs内置变量,用来获取当前文件所在的路径 }).listen(8080,'127.0.0.1'); console.log("success !");
用readFile异步方式读取就能解决请求路径下没找到文件,服务器挂掉的问题。
readFile()的callback中第一个参数[err]是一个对象,当解析路径出错这样一个对象。
关于 /favicon.ico 请求的问题,在请求启动服务后加上 “Server has started.”