1、使用http创建静态web服务器
解析用户请求的 url,将 url 的路径名称和静态目录的名称进行拼接,若 url 指定文件存在,则返回该文件内容
function staticRoot(staticPath, req, res){
var pathObj = url.parse(req.url, true);
var filePath = path.join(staticPath, pathObj.pathname);
fs.readFile(filePath,'binary', function(err, content){
if(err){
res.writeHead('404', 'Not Found');
res.end()
}else{
res.writeHead(200, 'Ok');
res.write(content, 'binary');
res.end()
}
})
}
2、设置路由
1、http://localhost:8080/a 直接发送GET请求
2、http://localhost:8080/b?world=helloworld 发送附带搜索条件的GET请求
3、http://localhost:8080/search 发送附带搜索条件的POST请求(请求内容不在 URL 中)
var routes = {
'/a': function(req, res){
res.end('match /a')
},
'/b': function(req, res){
res.end(JSON.stringify(req.query))
},
'/search': function(req, res){
res.end('username='+req.body.username+',password='+req.body.password)
}
};
3、创建路由
1、如果pathname与动态路由routes相匹配,则按rounts的要求执行,否则执行static中的内容
2、若发送附带搜索条件的GET请求,则将 query 绑定到 req 上
3、若发送附带搜索条件的POST请求,则监听数据内容,将数据内容存放 body 中,用 parseBody(body) 将其进行解析后绑定到 req 上
function routePath(req, res){
var pathObj = url.parse(req.url, true);
var handleFn = routes[pathObj.pathname];
if(handleFn){
req.query = pathObj.query;// 将 query 绑定到 req 上
var body = '';
// 监听 POST 的数据内容
req.on('data', function(chunk){
body += chunk
}).on('end', function(){
req.body = parseBody(body);
handleFn(req, res)
})
}else {
staticRoot(path.resolve(__dirname, 'static'), req, res);
}
}
function parseBody(body){
console.log(body);
var obj = {};
body.split('&').forEach(function(str){
obj[str.split('=')[0]] = str.split('=')[1]
});
return obj
}
4、完整代码
var http = require('http');
var path = require('path');
var fs = require('fs');
var url = require('url');
var routes = {
'/a': function(req, res){
res.end('match /a')
},
'/b': function(req, res){
res.end(JSON.stringify(req.query))
},
'/search': function(req, res){
res.end('username='+req.body.username+',password='+req.body.password)
}
};
var server = http.createServer(function(req, res){
routePath(req, res)// 对发送过来的url进行解析
}).listen(8080);
function routePath(req, res){
var pathObj = url.parse(req.url, true);
var handleFn = routes[pathObj.pathname];
if(handleFn){
req.query = pathObj.query;// 将 query 绑定到 req 上
var body = '';
req.on('data', function(chunk){
body += chunk
}).on('end', function(){
req.body = parseBody(body);
handleFn(req, res)
})
}else {
staticRoot(path.resolve(__dirname, 'static'), req, res);
}
}
function staticRoot(staticPath, req, res){
var pathObj = url.parse(req.url, true);
var filePath = path.join(staticPath, pathObj.pathname);
fs.readFile(filePath,'binary', function(err, content){
if(err){
res.writeHead('404', 'Not Found');
return res.end()
}
res.writeHead(200, 'Ok');
res.write(content, 'binary');
res.end()
})
}
function parseBody(body){
console.log(body);
var obj = {};
body.split('&').forEach(function(str){
obj[str.split('=')[0]] = str.split('=')[1]
});
return obj
}