今天刚学的如何应用nodejs创建web服务器,对学习资料进行整理归纳下,希望大神们给指点下!
项目整体分类
首页布局
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css"/>
<script type="text/javascript" src="/static/js/jquery-1.11.3.js"></script>
<script src="/static/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
</head>
<body>
<nav class="navbar navbar-default">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Brand</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li>
<li><a href="#">Link</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">One more separated link</a></li>
</ul>
</li>
</ul>
<form class="navbar-form navbar-left">
<div class="form-group">
<input type="text" class="form-control" placeholder="Search">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
<ul class="nav navbar-nav navbar-right">
<li><a href="#">Link</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
</body>
</html>
router下config.js文件配置
const url_util = require("url");
const fs = require("fs-extra");
const path = require("path");
const mime = require("mime");
const router = {
get(path,cb){
this.routes.push({
path,
method : "get",
handler : cb
})
},
handler: function (req, res) {
//改装res使其拥有render方法来渲染整个页面
this.refitRes(res);
let url_info = url_util.parse(req.url);
let pathname = url_info.pathname;
//判断是否为资源请求,是的话读取对应的文件,然后响应
if(pathname.startsWith("/static/")){
this.responseStatic(pathname,res);
}
this.routes.forEach(route => {
if (route.path == pathname) {
route.handler(req, res);
}
})
},
responseStatic(pathname,res){//找到对应的文件
fs.readFile(path.join(__dirname,".." + pathname),(err,content)=>{
if(err) throw err
res.writeHead(200,{"Content-type" : mime.getType(pathname)})
res.end(content)
})
},
refitRes(res){
res.render = function (html) {
//找到HTML文件并响应
fs.readFile(path.join(__dirname, `../static/${html}.html`), (err, content)=> {
if (err) throw err;
res.writeHead(200,{"Content-type" : "text/html;charset=utf8"});
res.end(content);
})
}
}
}
module.exports = router
router下index.js配置
const router = require("./config")
router.get("/",(req,res) =>{
res.render("index")
})
module.exports = router.handler.bind(router);
config下index.js配置
const config = {
dev : {
port : 3000
},
pro : {
port : 80,
hostname : "www.xxxx.com"
}
}
module.exports = config;
创建一个nodejs服务器(server.js)
const http = require("http");
const config = require("./config");
const router = require("./router");
const mode = 'dev';
const server = http.createServer(router);
server.listen(config[mode].port,config[mode].hostname,() =>{
console.log(`server is listening...`);
});