英雄初级版
核心库
- 核心库不需要下载,直接引用
第三方插件
- 在项目主目录下载第三方包
- npm install art-template
- 需要的第三方插件有
- bootstrap
- jquery
art-template
自定义模块
- 自定义模块的返回值:
module.exports
- 自定义模块的引入,不能省略
./
app.js
var http = require("http");
var server = http.createServer();
var render = require("./render");
var route = require("./route");
server.on("request",function (req,res) {
//为res添加一些方法
render(res);
//路由
route(req,res);
});
server.listen(3000,function(){
//没有参数
//监听3000,成功会触发该函数
console.log("running");
});
注意:
- server的一个方法,一个事件
- 回调函数的参数
render.js
var fs = require("fs");
var template = require("art-template");
module.exports = function (res) {
//该方法,有模板,有数据,去返回一个渲染好的页面
res.render = function(tplName,data){
//默认模板路径
var tplPath = "./view/" + tplName + ".html";
fs.readFile(tplPath,"utf8",function(err,tplData){
//如果读错,说明模板错误
if (err) {
return res.end("Can't find template:" + tplName);
}
//传进来的data是一个json字符串或对象
var htmlStr = template.compile(tplData)(data);
res.end(htmlStr);
});
};
}
注意:
- 该模块的功能,为res添加方法,使其可以返回一个页面
- 需要参数:模板路径,数据
- 读取文件,使用了utg8
- 错误时的响应,正确时的返回
route.js
var handler = require("./handler");
module.exports = function (req,res) {
//路径
var url = req.url;
//获取方式
var method = req.method.toLowerCase();
//进行判断
if (url === "/") {
handler.queryIndex(req,res);
//静态资源
}else if (url.indexOf("/node_modules") === 0 || url.indexOf("/img") === 0) {
handler.queryStatic(req,res);
//add的get 请求
}else if (method === "get" && url === "/add") {
handler.queryAddGET(req,res);
}else if (method === "post" && url === "/add") {
handler.queryAddPost(req,res);
}
}
注意:
- req请求对象
- url 请求路径
- method 请求类型
- 判断静态资源的类型,img是图片,node_modules是外库,这些是可以访问的
- 通过请求类型,复用/add页面
handler.js
var fs = require("fs");
var handler = {};
handler.queryIndex = function (req,res) {
fs.readFile("./data/user.json","utf8",function(err,data){
if (err) {
throw err;
}
data = JSON.parse(data);
res.render("index",data);
});
}
handler.queryAddGET = function (req,res) {
res.render("add",{});
}
handler.queryAddPost = function (req,res) {
//post 方式提交,是可能提交多次的
var formData = "";
var tempObj = {};
req.on("data",function(chunk){
formData += chunk;
});
req.on("end",function(){
//将数据解码
formData = decodeURI(formData);
//当表单数据提交完毕
formData.split("&").forEach(function(item){
var arr = item.split("=");
tempObj[arr[0]] = arr[1];
});
// 读取文件,添加进去
fs.readFile("./data/user.json","utf8",function(err,data){
//读错
if (err) {
//end方法返回的是一个字符串
res.end(JSON.stringify({
code:"0",
message:err.message
}))
}
//转化成对象
data = JSON.parse(data);
data.heros.push({
"id": 1,
"name": tempObj.name,
"gender": tempObj.gender,
"avatar": "img/131.jpg"
});
//转化成字符串
data = JSON.stringify(data);
//存入文件,回调只有一个参数
fs.writeFile("./data/user.json",data,function(err){
if (err) {
//end方法返回的是一个字符串
res.end(JSON.stringify({
code:"0",
message:err.message
}))
}
res.end(JSON.stringify({
code:"200"
}));
});
});
});
}
handler.queryStatic = function (req,res) {
//获取路径
//记得处理成文件路径
var filePath = "." + req.url;
fs.readFile(filePath,function(err,data){
if (err) {
return res.end("404 Not Found");
}
res.end(data);
});
}
module.exports = handler;
注意:
- 将路径分发后的逻辑存入在一个模块中
- index页面
- 读取json文件,使用render方法
- 读取utf8
- 读取出错,抛出错误,属于服务端错误,直接抛出错误
- 静态资源
- 读取对应的文件
- 不使用utf8
- 读取出错,向服务端返回自定义的错误信息
- 使用 return res.end(JSON.stringify());
- 注意return
- 注意end参数值为字符串
- get方式
- post方式
- 可能多次传递
- data事件
- end事件
- 读取文件,utf8,为字符串
- 如果出错: return res.end(JSON.stringify());
- 转成对象,添加信息,再转成字符串,写入文件
- 正确: res.end(JSON.stringify());
读写文件出错的处理
- 向浏览器返回出错信息,注意使用return,这样接下来的语句就不会执行。
- 直接抛出错误,服务器会停止
网友评论