// 引用模块(与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('404 未找到页面
'); }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.”