nodejs05

作者: 我_巨可爱 | 来源:发表于2017-10-30 16:48 被阅读0次

英雄初级版

核心库

  1. 核心库不需要下载,直接引用

第三方插件

  1. 在项目主目录下载第三方包
  • npm install art-template
  1. 需要的第三方插件有
  • bootstrap
  • jquery
  • art-template

自定义模块

  1. 自定义模块的返回值:module.exports
  2. 自定义模块的引入,不能省略./

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

注意:

  1. server的一个方法,一个事件
  2. 回调函数的参数

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

注意:

  1. 该模块的功能,为res添加方法,使其可以返回一个页面
  2. 需要参数:模板路径,数据
  3. 读取文件,使用了utg8
  4. 错误时的响应,正确时的返回

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

注意:

  1. req请求对象
  • url 请求路径
  • method 请求类型
  1. 判断静态资源的类型,img是图片,node_modules是外库,这些是可以访问的
  2. 通过请求类型,复用/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;

注意:

  1. 将路径分发后的逻辑存入在一个模块中
  2. index页面
  • 读取json文件,使用render方法
  • 读取utf8
  • 读取出错,抛出错误,属于服务端错误,直接抛出错误
  1. 静态资源
  • 读取对应的文件
  • 不使用utf8
  • 读取出错,向服务端返回自定义的错误信息
  • 使用 return res.end(JSON.stringify());
  • 注意return
  • 注意end参数值为字符串
  1. get方式
  2. post方式
  • 可能多次传递
  • data事件
  • end事件
  • 读取文件,utf8,为字符串
  • 如果出错: return res.end(JSON.stringify());
  • 转成对象,添加信息,再转成字符串,写入文件
  • 正确: res.end(JSON.stringify());

读写文件出错的处理

  1. 向浏览器返回出错信息,注意使用return,这样接下来的语句就不会执行。
  2. 直接抛出错误,服务器会停止

相关文章

  • NodeJs05

    ES6对象的简写方法 --------------------------------------- 1. 对象的...

  • nodejs05

    英雄初级版 核心库 核心库不需要下载,直接引用 第三方插件 在项目主目录下载第三方包 npm install ar...

网友评论

      本文标题:nodejs05

      本文链接:https://www.haomeiwen.com/subject/dvqmpxtx.html