欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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);
}