浏览器客户端请求的 不同URL 和其他需要的 GET 及 POST 参数,路由需要根据这些数据来执行相应的代码
简单的模块化服务器和路由
浏览器请求服务器 → app → server → router → handle → response返回到浏览器
app.js文件
var server = require("./server")
//匹配路由
var route = require("./router")
//所有路由函数
var handler = require("./handle")
var handle = {}
//设置不同url执行不同路由函数
handle['/'] = handler.home
handle['/home'] = handler.home
handle['/list'] = handler.list
handle['/api/josn'] = handler.apiJson
server.startServer(route,handle)
server.js文件
let http = require("http")
//let fs = require("fs")
function startServer(route,handle){
//创建web服务器 request和response都是流的实例
var server = http.createServer(function(request,response){
//执行路由传入 路由方法函数 请求的地址 服务器返回值response
route(handle,request.url,response)
// if(request.url == '/' || request.url == '/home'){
// //设置响应头
// response.writeHead(200, { 'Content-Type': 'text/html' });
// //创建读取流 //通过管道写入到response 传输到浏览器
// fs.createReadStream(__dirname +'/index.html','utf8').pipe(response)
// }else if(request.url == '/list'){
// response.writeHead(200, { 'Content-Type': 'text/html' });
// //创建读取流 //通过管道写入到response 传输到浏览器
// fs.createReadStream(__dirname +'/list.html','utf8').pipe(response)
// }else if(request.url == '/api/json'){
// response.writeHead(200, { 'Content-Type': 'application/json' });
// var jsonObj = {
// name: "小明"
// };
// response.end(JSON.stringify(jsonObj));
// }else{
// response.writeHead(404, { 'Content-Type': 'text/html' });
// //创建读取流 //通过管道写入到response 传输到浏览器
// fs.createReadStream(__dirname +'/404.html','utf8').pipe(response)
// }
})
//监听在端口8888
server.listen(8888,'127.0.0.1')
console.log('服务启动端口8888')
}
exports.startServer = startServer
router.js文件
var fs = require("fs")
var route = function(handle,url,response){
// console.log(url)
//通过url匹配执行对应方法函数
if(typeof handle[url] == 'function'){
handle[url](response)
}else{
response.writeHead(404,{ 'Content-Type' : 'text/html' })
fs.createReadStream(__dirname + '/404.html','utf8').pipe(response)
}
}
module.exports = route
handle.js文件
var fs = require("fs")
// 所有路由方法函数
function home(response){
console.log('home')
response.writeHead(200,{'Content-Type':'text/html'})
fs.createReadStream(__dirname+'/index.html','utf8').pipe(response)
}
function list(response){
console.log('list')
response.writeHead(200,{'Content-Type':'text/html'})
fs.createReadStream(__dirname+'/list.html','utf8').pipe(response)
}
function apiJson(response){
console.log('json')
var json = {
name:'小明',
age:12
}
response.writeHead(200,{'Content-Type':'application/json'})
response.write(JSON.stringify(json))
response.end()
}
module.exports = {
home:home,
list:list,
apiJson:apiJson
}
修改代码 判断GET和POST请求
server.js文件
var http = require("http")
var fs = require("fs")
// var url = require("url")//已废弃 获取url路径部分 用new URL() 类替代
var querystring = require("querystring")
//处理静态资源
var staticFile = require("./stiticFile")
function startServer(route,handle){
//创建web服务器 request和response都是流的实例
var server = http.createServer(function(request,response){
// console.log(request.url)
//静态资源 .css .js .jpg 等文件需要单独处理
if(staticFile(request,response)){
return false
}
//获取和设置网址的路径部分
var pathname = new URL(request.url,'http://locathost:8888').pathname
console.log("路径:"+ pathname )
var data = ""
request.on("error",function(err){
console.error(err)
}).on("data",function(chunk){
data +=chunk
}).on("end",function(){
//POST请求 监听请求流的data事件拼接数据 再把数据传参到路由做处理
if(request.method == "POST"){
//执行路由传入 路由方法函数 请求的地址 服务器返回值response
route(handle,pathname,response,querystring.parse(data))
}else{//GET请求 通过url获取数据 再把数据传参到路由做处理
var params = new URL(request.url,'http://locathost:8888').search
params = params.slice(1,params.length)
console.log(JSON.stringify(querystring.parse(params)))
//执行路由传入 路由方法函数 请求的地址 服务器返回值response
route(handle,pathname,response,querystring.parse(params))
}
})
})
//监听在端口8888
server.listen(8888,'127.0.0.1')
console.log('服务启动端口8888')
}
exports.startServer = startServer
staticFile.js文件
处理静态资源 .css .js .jpg 等文件请求需要单独处理
var fs = require("fs")
function staticFile(req,res){
// console.log(req)
var staticType = req.url.split('.')[req.url.split('.').length - 1]
if(staticType == 'css'){
res.writeHead(200,{'Content-Type' : 'text/css'})
fs.createReadStream(__dirname + req.url,'utf8').pipe(res)
return true
}
if(staticType == 'js'){
res.writeHead(200,{'Content-Type' : 'text/js'})
fs.createReadStream(__dirname + req.url,'utf8').pipe(res)
return true
}
if(['gif', 'jpeg', 'jpg', 'png'].includes(staticType)){
console.log("图片路径" +__dirname + req.url)
res.writeHead(200,{'Content-Type' : 'image/' + staticType})
fs.createReadStream(__dirname + req.url).pipe(res)
return true
}
return false
}
module.exports = staticFile