Node.JS搭建简易版json服务

node.js对于追逐全栈开发的小伙伴们自然不陌生。他是建立与chrome v8引擎下的高性能,异步io、事件驱动javascript语言,使编写高性能web服务轻而易举。今天要分享的是一个使用node.js逐步推演建立一个完善的json服务的过程。通过对代码逐步完善来介绍node.js的特点及执行流程。闲话少许,进入正题。

业务场景描述:监听指定端口,分析请求url,返回对应的图片目录或图片文件列表。Round 1:搭建json服务 监听8000端口

登录后复制

var _http=require("http");var _url=require("url");var _fs=require("fs");/** * test res show message is success! */var _server=_http.createServer((req,res)=>{    console.log("json webservice is running");    res.end("hello accp!");});_server.listen(8000);

登录后复制

已上代码实现监听本地8000端口,当通过浏览器访问时,即可触发对应代码。如图

Node.JS搭建简易版json服务

Round 2 : 返回json格式数据

登录后复制

var _http=require("http");var _url=require("url");var _fs=require("fs");/** * test res show json message is success! */var  _server=_http.createServer((req,res)=>{    console.log("json sebservice is running!");    //http://nodejs.cn/api/http.html#http_response_writehead_statuscode_statusmessage_headers    //response html head http://www.runoob.com/http/http-header-fields.html    //Content-Type MIME VALUES    //a pplication/msword        doc    Microsoft Word    // application/octet-stream bin    dms lha lzh exe class    可执行程序    // application/pdf    pdf    Adobe Acrobat    // application/postscript    ai eps ps    PostScript    // appication/powerpoint    ppt    Microsoft Powerpoint    // appication/rtf    rtf    rtf 格式    // appication/x-compress    z    unix 压缩文件    // application/x-gzip    gz    gzip    // application/x-gtar    gtar    tar 文档 (gnu 格式 )    // application/x-shockwave-flash    swf    MacroMedia Flash    // application/x-tar    tar    tar(4.3BSD)    // application/zip    zip    winzip    // audio/basic    au snd    sun/next 声音文件    // audio/mpeg    mpeg mp2    Mpeg 声音文件    // audio/x-aiff    mid midi rmf    Midi 格式    // audio/x-pn-realaudio    ram ra    Real Audio 声音    // audio/x-pn-realaudio-plugin    rpm    Real Audio 插件    // audio/x-wav    wav    Microsoft Windows 声音    // image/cgm    cgm    计算机图形元文件    // image/gif    gif    COMPUSERVE GIF 图像    // image/jpeg    jpeg jpg jpe    JPEG 图像    // image/png    png    PNG 图像    // text/html    HTML     // text/plain          TXT     // text/xml             XML    // text/json           json字符串        res.writeHead(200,{'Content-Type':'text/json'});    var out={        err:null,        data:{            showMessage:"hello world"        }    };    res.end(JSON.stringify(out));});_server.listen(8000);

登录后复制

Node.JS搭建简易版json服务

Round 3:测试 json webservice 输出 文件夹列表 列表

登录后复制

/** *  * @authors Your Name (you@example.org) * @date    2018-02-21 14:44:34 * @version $Id$ */var _http=require("http");var _url=require("url");var _fs=require("fs");/** * 测试 json webservice 输出 文件夹列表 */var _server=_http.createServer((req,res)=>{    console.log("json webservice is running!");    var out={};    load_image_list((err,files)=>{        if(err){            res.writeHead(403,{                "Content-Type":"text/json; charset=utf-8"            });            out={err:err,data:{}};            res.end(JSON.stringify(out));            return;        }        //指定 返回字符串编码        res.writeHead(200,{            "Content-Type":"text/json; charset=utf-8"        });        out={err:err,data:{imageList:files}};        res.end(JSON.stringify(out),'utf-8');        return;    });    //http://nodejs.cn/api/fs.html#fs_fs_readdir_path_options_callback    });/** * 初始化 图片列表 返回 指定图片文件夹列表 * bug 未对目录下 文件类型进行判断 同时返回 当前目录下 所有文件类型 * @param  {Function} callback 回调函数 * * @return {[type]}            [description] */var load_image_list=function(callback){    _fs.readdir("images/",(err,files)=>{        if(err){            callback(err);            console.log("load_image_list try exception!");            return;        }        callback(null,files);    });};_server.listen(8000);

登录后复制

Node.JS搭建简易版json服务
这里可以看到load_image_list方法注释内容提到,当前代码存在一定的漏洞,如果当前文件夹目录下存在图片文件,在返回结果时也会返回如图。针对此bug修改load_image_list。
Node.JS搭建简易版json服务

** * 初始化 图片列表 返回 指定图片文件夹列表 * 增加 对指定目录下 文件类型的判断 只返回 文件夹 * @param  {Function} callback 回调函数 * * @return {[type]}            [description] */var load_image_list=function(callback){    _fs.readdir('images/',(err,files)=>{        if(err){            console.log("load image list throw exception!");            callback(err);            return;        }        var only_dir=[];        //创建 匿名方法 通过递归方式 将异步判断 变更为 同步判断                (function rtnPathIsDirList(index){            if(index==files.length){                callback(null,only_dir);                return;            }            _fs.stat("images/"+files[index], (err,stats)=>{                if(err){                    console.log("load image list check file type throw exception!");                    callback(err);                    return;                }                if(stats.isDirectory()){                    only_dir.push(files[index]);                }                rtnPathIsDirList(index+1);                return;            });        })(0);    });};

登录后复制

Round 4 :增加 路由器 功能 针对 传递进来的 url进行 分析

登录后复制

/** *  * @authors Your Name (you@example.org) * @date    2018-02-21 15:01:25 * @version $Id$ */var _http=require("http");var _url=require("url");var _fs=require("fs");/** * 测试 json webservice 输出 文件夹列表 * 增加 路由器 功能 针对 传递进来的 url进行 分析  * 增加 加载 图片列表 文件目录 输入 */var _url=require('url');var _server=_http.createServer((req,res)=>{    console.log("json webservice is running!");    var out={};    //增加 请求 url 的分析    console.log(req.url);    var urlValue=req.url;    var urlLength=urlValue.length;    //console.log("urlValue.substr(1,11)"+urlValue.substr(1,11));    //排除 浏览器 发起的 获取 图标请求    if(urlValue=="/favicon.ico"){        console.log("web brower favicon request!");        res.end();        return;    }    if(urlValue=="/images.json"){        //获取 根目录 文件夹列表        console.log("load images list is running!");        handle_list_image(req,res,urlValue.substr(1,6)+"/");        return;    }else if(urlValue.substr(1,6)=="images"&&urlValue.substr(urlLength-4)=="json"){        //加载 某一个 目录下 的文件                console.log("load image path:"+urlValue.substr(1,urlValue.length-6));        handle_list_imageFile(req,res,urlValue.substr(1,urlValue.length-6)+"/");        return;    }else{        //无正常 数据 加载 返回404 错误。        sendFailMessage(404,"请求页面不存在",res);        console.log("error");        return;    }        //http://nodejs.cn/api/fs.html#fs_fs_readdir_path_options_callback    });/** * 获取图片列表 * 增加加载图片列表路径参数 * 将返回成功信息和失败信息进行封装 * * @param  {[type]} req [description] * @param  {[type]} res [description] * @param  {[string]} filePath [加载更目录] * * @return {[type]}     [description] */var handle_list_image=function(req,res,filePath){    load_image_list(filePath,(err,files)=>{        if(err){            // res.writeHead(403,{            //     "Content-Type":"text/json; charset=utf-8"            // });            // out={err:err,data:{}};            // res.end(JSON.stringify(out));            sendFailMessage(403,err,res);            return;        }        //指定 返回字符串编码                // res.writeHead(200,{        //     "Content-Type":"text/json; charset=utf-8"        // });        // out={err:null,data:{imageList:files}};        // res.end(JSON.stringify(out),'utf-8');        //         var data={imageList:files};        sendSuccessMessage(data,res);        return;    });};/** * 获取文件 图片文件列表 * * @param  {[type]} req      [description] * @param  {[type]} res      [description] * @param  {[type]} filePath [description] * * @return {[type]}          [description] */var handle_list_imageFile=function(req,res,filePath){    load_imageFile_list(filePath,(err,files)=>{        if(err){            // res.writeHead(403,{            //     "Content-Type":"text/json; charset=utf-8"            // });            // out={err:err,data:{}};            // res.end(JSON.stringify(out));            sendFailMessage(403,err,res);            return;        }        //指定 返回字符串编码                // res.writeHead(200,{        //     "Content-Type":"text/json; charset=utf-8"        // });        // out={err:null,data:{imageList:files}};        // res.end(JSON.stringify(out),'utf-8');        //         var data={imageList:files};        sendSuccessMessage(data,res);        return;    });};/** * 返回成功信息 * * @param  {json} dataContent 返回数据json信息 * @param  {response} res         [description] * * @return {[type]}             [description] */var sendSuccessMessage=function(dataContent,res){    //指定 返回字符串编码    res.writeHead(200,{        "Content-Type":"text/json; charset=utf-8"    });    out={err:null,data:dataContent};    res.end(JSON.stringify(out),'utf-8');}/** * 返回失败信息 * * @param  {int} code 失败代码 * @param  {error} err  [description] * @param  {[type]} res  [description] * * @return {[type]}      [description] */var sendFailMessage=function(code,err,res){    res.writeHead(code,{            "Content-Type":"text/json; charset=utf-8"    });    out={err:err,data:{}};    res.end(JSON.stringify(out));}/** * 初始化 图片列表 返回 指定图片文件夹列表 * 增加 对指定目录下 文件类型的判断 只返回 文件夹 * 增加 遍历目录 变量     * @param  {stinrg}   filePath 加载目录  * @param  {Function} callback 回调函数 * * @return {[type]}            [description] */var load_image_list=function(filePath,callback){    _fs.readdir(filePath,(err,files)=>{        if(err){            console.log("load image list throw exception!");            callback(err);            return;        }        var only_dir=[];        //创建 匿名方法 通过递归方式 将异步判断 变更为 同步判断                (function rtnPathIsDirList(index){            if(index==files.length){                callback(null,only_dir);                return;            }            _fs.stat(filePath+files[index], (err,stats)=>{                if(err){                    console.log("load image list check file type throw exception!");                    callback(err);                    return;                }                if(stats.isDirectory()){                    only_dir.push(files[index]);                }                rtnPathIsDirList(index+1);                return;            });        })(0);    });};/** * 初始化 图片列表 返回 指定图片文件列表 * 增加 对指定目录下 文件类型的判断 只返回 文件 * 增加 遍历目录 变量     * @param  {stinrg}   filePath 加载目录  * @param  {Function} callback 回调函数 * * @return {[type]}            [description] */var load_imageFile_list=function(filePath,callback){    _fs.readdir(filePath,(err,files)=>{        if(err){            console.log("load image file list throw exception!");            callback(err);            return;        }        var only_dir=[];        //创建 匿名方法 通过递归方式 将异步判断 变更为 同步判断                (function rtnPathIsDirList(index){            if(index==files.length){                callback(null,only_dir);                return;            }            _fs.stat(filePath+files[index], (err,stats)=>{                if(err){                    console.log("load image list check file type throw exception!");                    callback(err);                    return;                }                if(stats.isFile()&&files[index].substr(files[index].length-3,3)=="jpg"){                    console.log("files[index]:"+files[index]);                    console.log("files[index].substr(files[index].length-3,3):"+files[index].substr(files[index].length-3,3)+"");                    only_dir.push(files[index]);                }                                rtnPathIsDirList(index+1);                return;            });        })(0);    });};_server.listen(8000);

登录后复制

这里主要是增加了路由的功能,测试访问路径如下:
http://localhost:8000  返回结果如图;
Node.JS搭建简易版json服务

http://localhost:8000/images.json 返回结果如图;
Node.JS搭建简易版json服务

http://localhost:8000/images/image1.json 返回结果如图;
Node.JS搭建简易版json服务

相关推荐:

js调用json的方法总结

html里table表数据如何转为Json格式

Ajax前后端使用JSON进行交互实现方法

以上就是Node.JS搭建简易版json服务的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2786136.html

(0)
上一篇 2025年3月8日 17:40:03
下一篇 2025年2月22日 17:17:45

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 原生JS实现Tab选项卡各种效果

    前一段时间我写了几篇关于css属性的理解和用法方面的文章,今天就不分享css属性了,给大家分享一个我们在实际工作中用到比较多的一个效果——tab选项卡效果。首先,我们先来看看tab选项卡效果是什么样子,以qq新闻为例,有如下效果: 当鼠标滑…

    2025年3月8日 编程技术
    200
  • js组合设计模式详解

    组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。 它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与…

    2025年3月8日
    200
  • JavaScript和Python 的数组去重解析

    “数组去重” 是实际应用中常用的操作,出现在面试题中的概率也很高,今天简述一下 python 和 javascript 中数组去重的方法,希望能帮助到大家。 python数组去重 >>> a = […

    2025年3月8日
    200
  • js控制文件拖拽及获取拖拽内容

    在用户拖拽文件到浏览器的某个元素上时,js可以监听到与拖拽相关的事件,并对拖拽结果进行处理,本文讨论下和拖拽文件相关的一些问题,不过没有处理太多关于兼容性的问题。 拖拽事件 js能够监听到拖拽的事件有drag、dragend、dragent…

    编程技术 2025年3月8日
    200
  • JS常用设计模式

    大型单页应用里,复杂度上升到一定程度时,没有适当的设计模式进行降耦,后续的开发也难以下手。而设计模式正是为了降耦而存在。 单例模式 单例模式的核心是确保只有一个实例,并且提供全局访问。 特点 满足“单一职责原则” : 使用代理模式,不在构造…

    编程技术 2025年3月8日
    200
  • javascript数据结构与算法详解

    请实现一个函数,输入一个整数,输出该数二进制表示1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。首先对于二进制1的求解,在这里,我们最应该想到的就是关于位运算的一些操作符。总共有五种运算,分别是:与(&a…

    编程技术 2025年3月8日
    200
  • JavaScript构造器详解

    对构造函数有很好的理解是你掌握javascript这门语言的重点。我们都知道javascript不像其他语言,它没有class关键字,但是它有跟function非常相似的构造函数。这篇文章我们一起来详细地了解javascript构造函数如何…

    编程技术 2025年3月8日
    200
  • plotly.js 绘图库入门教程分享

    本文主要和大家介绍了详解plotly.js 绘图库入门使用教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 Plotly 缘起 这两天想在前端展现数学函数图像,猜测应该有成熟的 js 库。…

    2025年3月8日
    200
  • 详解Nodejs模块载入运行原理

    使用nodejs,就不可避免地引用第三方模块,它们有些是nodejs自带的(例:http,net…),有些是发布在npm上的(例:mssql,elasticsearch…) 本篇章聚焦3个问题: Nodejs模块的加…

    2025年3月8日 编程技术
    200
  • Node.js中的Async和Await函数解析

    本文主要和大家介绍了node.js中的async和await函数的相关知识,你将学习如何使用node.js中的async函数(async/await)来简化callback或promise.非常不错,具有参考借鉴价值,需要的朋友可以参考下,…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论