【Node.js】静态路由
程序员文章站
2024-02-12 17:46:34
...
最初学习网址制作时,使用的Java Web,从未考虑过路由问题,它自身已经为我们做好了静态路由。
后来学习Node.js,尝试使用express框架写Web,非常奇怪为什么路由的根路径是public,不明白是怎么回事。后来看到一些资料才明白,都是路由搞得鬼,自己尝试写了个静态路由,供大家参考。GitHub:https://github.com/swl979623074/node-test-ChuanZhi
当http收到前端的请求时,后台会根据请求的地址(即req.url)解析请求的资源,并将资源返回给前端。这些资源是指文件资源和数据,数据通常是指数据库中的数据,这一块今天不讲,主要说文件资源,即静态资源。
在一个完整的HTML文件中,通常包括script、link、img标签,这些标签会向后台请求静态资源文件,在Java Web中它已经将静态路由为我们自动实现,但是在Node.js中并没有实现,路由部分需要我们自己去实现。向实现普通xhr请求一样,当前端请求静态资源时,我们只需要使用fs模块,将本地文件读取之后传回前端,同时要将文件类型一起发送到前端。
路由源码如下:一般文件是有后缀名的,通过有无后缀名判断是否是一个请求静态资源的,有则返回文件,无则做正常的数据处理。
"use static"
var http = require("http");
var fs = require("fs");
var url = require("url");
var path = require("path");
var mime = require("./mime.js")
http.createServer(function(req,res){
handleReq(req,res);
}).listen(3000,"127.0.0.1")
function handleReq(req,res){
var url_req = url.parse(req.url).pathname;
if("/" == url_req){
url_req = "/index.html";
}
var extname = path.extname(url_req);
//存在扩展名
if(extname){
handleReqWhenHasExtname(res,url_req,extname);
}else{
handleReqWhenHasNoExtname(res,url_req);
}
}
function handleReqWhenHasExtname(res,url,extname){
if("/favicon.ico" == url){
fs.readFile("./public/img/favicon.ico",function(err,data){
res.writeHead(200,{"Content-Type":mime.getMime(extname),"charset":"UTF-8"})
res.end(data);
return;
})
}else{
fs.readFile("./public"+url,function(err,data){
if(err){
errorHandler(res)
}else{
staticResourceHandler(res,extname,data);
}
})
}
}
function handleReqWhenHasNoExtname(res,url){
res.writeHead(200,{"Content-Type":"text/html","charset":"UTF-8"});
res.write("<h1>this is a ajax request</h1>");
res.write("<h3>url: "+url+"</h3>");
res.end();
}
function errorHandler(res){
res.writeHead(404,{"Content-Type":"text/html","charset":"UTF-8"});
res.write("<h1>Not Found 404</h1>");
res.write("<h3>Can't Find The Request Source</h3>");
res.end();
}
function staticResourceHandler(res,extname,data){
res.writeHead(200,{"Content-Type":mime.getMime(extname),"charset":"UTF-8"})
res.end(data);
}