• 三狮军团首秀 只有两千多球迷观战 2019-05-19
  • 人民网2017呼和浩特徒步迎新活动--内蒙古频道--人民网 2019-05-19
  • 【品牌资讯】环球网斩获“全国行业新闻网站传播力2017年6月榜”多项冠军 2019-05-15
  • 深化对经济工作主线的认识 从供需关系看供给侧结构性改革 2019-05-15
  • 格拉斯哥艺术学院起火 4年前曾遭火灾仍在整修 2019-05-14
  • 回复@地瓜干17世:猪临死才会嚎叫呢~ 2019-05-14
  • 婺源古村溪中发现鹰嘴龟 2019-05-08
  • 编辑评测:高夫净源控油平衡露 极速补水长效控油 2019-05-08
  • 四部门发文规范特色小镇建设防止“新瓶装旧酒” 2019-05-02
  • 【地球的盛会文明的聚会艺术的盛宴四海一家足球为人类和平幸福而荣耀!!!普京是当今人类世界最优秀的一代伟人俄罗斯赢啦!!!】 2019-04-29
  • 学习新思想,千万师生同上一堂课 2019-04-28
  • 你这种个体户都干不了的老蚕也配谈计划?真是笑死人不偿命哦? 2019-04-23
  • 感人!的哥带着患病父亲出车 孝心感动乘客 2019-04-23
  • 图解:习近平在纪念马克思诞辰200周年大会上讲话的16个金句 2019-04-16
  • 感触名家笔下的端午文化 吃香粽原来可以这样"文艺" 2019-04-16
  • 十一选五中奖规则:零基础之Node.js搭建API服务器的详解

    山西体彩11选5直选遗漏 www.caxru.com  更新时间:2019年03月08日 11:35:50   作者:沙沙罗曼   我要评论

    今天小编就为大家分享一篇关于零基础之Node.js搭建API服务器的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    零基础之Node.js搭建API服务器

    这篇文章写给那些Node.js零基础,但希望自己动手实现服务器API的前端开发者,尝试帮大家打开一扇门。

    HTTP服务器实现原理

    HTTP服务器之所以能提供前端使用的API,其实现原理是服务器保持监听计算机的某个端口(通常是80),等待客户端请求,当请求到达并经过一系列处理后,服务器发送响应数据给到前端。

    平时大家通过Ajax调用API,即是发起一次请求,经过服务器处理后,得到结果,然后再进行前端处理。如今使用高级编程语言,要实现服务器那部分功能已经变得非常简单,接下来我们了解一下使用Node.js如何实现。

    什么是Node.js?它可以做什么?

    Node.js是一个JavaScript的运行时(runtime),它提供了大量用JS与操作系统打交道的API,通过这些API,我们可以调用本地程序、读写磁盘、监听端口、发起网络请求等,这足以开发出一个功能完善的Server。

    前期准备

    简单介绍完Node.js,开始写代码之前,我们需要安装Node.js,安装详细过程就不说明了,请大家Google或者百度。不同系统安装过程不一样,如果是Linux、Mac,会相对顺利且遇到问题的可能性较低。

    判断安装成功与否,windows下,在cmd中执行node -v,Linux、Mac下,在shell中执行node -v,正常输出版本号说明安装成功。

    tips:

    windows如果提示命令未找到,可能是未配置环境变量

    实现简单的Server

    Node.js安装成功,我们找个地方新建目录my-server作为我们的存放代码的地方,接下来所有的代码都在该目录下。首先,在my-server的目录下新建文件index.js,用如下代码实现一个简单的Server:

    // index.js
    // 通过require获取两个node内置???
    const http = require('http');
    const nUrl = require('url');
    // '127.0.0.1'表明只有本机可访问,'0.0.0.0'表示所有人可访问
    const hostname = '127.0.0.1';
    const port = 3000;
    // 通过http.createServer获取一个server实例
    // 其中(req, res) => {},在服务器每次接收到请求时都会被执行
    const server = http.createServer((req, res) => {
      let method = req.method; // 客户端请求方法
      let url = nUrl.parse(req.url); // 将请求url字符串转换为node的url对象
      // 如果客户端GET请求'/',会执行这个分支里面的逻辑
      if (method === 'GET' && url.pathname === '/') {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'text/plain');
        res.end('Hello World');
        return;
      }
      // 如果客户端GET请求'/api/user',会执行这个分支里面的逻辑
      if (method === 'GET' && url.pathname === '/api/user') {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'application/json');
        res.end(JSON.stringify({
          code: 0,
          msg: '',
          result: {
            username: 'shasharoman'
          }
        }));
        return;
      }
      // 没有匹配其他分支的话,执行以下逻辑
      res.statusCode = 404;
      res.setHeader('Content-Type', 'text/plain');
      res.end('Not Found');
    });
    // server开始监听,等待请求到来
    server.listen(port, hostname, () => {
      console.log(`Server running at //${hostname}:${port}/`);
    });

    文件内容编辑保存后,在my-server目录下通过命令node index.js启动服务,然后在浏览器中访问//127.0.0.1:300/、//127.0.0.1:300/api/user、//127.0.0.1:300/xxx观察不同结果。

    这是官方Guides经过小小修改得到的代码,添加部分注释以及额外逻辑。主要为了更清晰传达以下几个知识点:

    • 从req对象上获取method与url,这个req对象是客户端请求的“抽象表现”,平时写Ajax指定的绝大部分内容都可以从该对象上获取
    • 中间添加的两个if分支,主要是为了让大家了解服务器如何区分不同请求,决定做不同事情,即路由概念
    • Content-Type: application/json,通常API会使用的响应格式,表明返回数据是json格式,这是一个HTTP头部,属于HTTP协议相关知识
    • statusCode:404,HTTP最常见的错误“Not Found”,也属于HTTP协议相关知识

    往前优化一步

    通过上面的代码,实现了一个简单Server,但真实场景下我们会这样去实现吗?答案是肯定不会,所以我们还需要一步步完善,做以下几个修改:

    • 增加config,在其中配置hostname,port
    • 增加controller,用于分层以及分???/li>
    • 增加route,用于定义路由

    代码不多,一共五个文件:

    • config.js,配置文件
    • route.js,路由定义文件
    • controller/account.js,账号??橐滴袷迪治募?/li>
    • controller/index.js,业务汇总并暴露给外部
    • index.js,项目启动文件
    // config.js
    exports = module.exports = {
      hostname: '127.0.0.1',
      port: '3000'
    };
    // route.js
    exports = module.exports = [{
      method: 'GET',
      path: '/api/user',
      impl: 'account.userById'
    }, {
      method: 'POST',
      path: '/api/user',
      impl: 'account.createUser'
    }];
    // controller/account.js
    exports.userById = userById;
    exports.createUser = createUser;
    function userById(req, res) {
      res.end('waiting for impl.');
    }
    function createUser(req, res) {
      res.end('waiting for impl.');
    }
    // controller/index.js
    exports.account = require('./account');
    // index.js
    const http = require('http');
    const nUrl = require('url');
    const config = require('./config');
    const controller = require('./controller');
    const route = require('./route').map(item => {
      console.log(`route ${item.method}:${item.path}`);
      let tuple = item.impl.split('.');
      item.impl = controller[tuple[0]][tuple[1]];
      return item;
    });
    const server = http.createServer((req, res) => {
      let method = req.method;
      let url = nUrl.parse(req.url);
      let matchRoute = route.find(item => {
        return item.method === method && item.path === url.pathname;
      });
      if (matchRoute) {
        matchRoute.impl(req, res);
        return;
      }
      res.statusCode = 404;
      res.setHeader('Content-Type', 'text/plain');
      res.end('Not Found');
    });
    server.listen(config.port, config.hostname, () => {
      console.log(`Server running at //${config.hostname}:${config.port}/`);
    });

    依旧是用node index.js启动Server,如果要在现有模式下开发一个API,主要就两步:

    • 在route.js中定义路由
    • 在controller/中实现

    做这个程度的优化,只是为了向大家传达一些比较宽泛的概念,还不是真正用来写API服务,只是为了大伙练练手。

    这个程度还达不到真实场景需求,还需要经过几轮改造,包括???、层、common、lib、query解析,body解析、更灵活的route等一系列事情,限于篇幅,有机会在一一讲述。

    经过我的描述以及代码示例,如果大家有兴趣学习Node.js,建议多搜搜相关知识,保持关注,然后在逐步去熟悉Node.js流行的Web框架如:Express、Koa等,不过框架只是更高层面的封装,基础的概念以及知识还是需要花时间才能掌握。

    如果前端想尝试后端编程,请一定先学习HTTP协议,推荐《HTTP权威指南》从头到尾认真看一遍。

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

    相关文章

  • koa上传excel文件并解析的实现方法

    koa上传excel文件并解析的实现方法

    这篇文章主要介绍了koa上传excel文件并解析的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • gulp安装以及打包合并的方法教程

    gulp安装以及打包合并的方法教程

    这篇文章主要给大家介绍了关于gulp实现人一个打包合并的方法教程,并分享了gulp打包js/css时合并成一个文件时的顺序的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • node.js中的fs.readFileSync方法使用说明

    node.js中的fs.readFileSync方法使用说明

    这篇文章主要介绍了node.js中的fs.readFileSync方法使用说明,本文介绍了fs.readFileSync的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • nodejs入门教程五:连接数据库的方法分析

    nodejs入门教程五:连接数据库的方法分析

    这篇文章主要介绍了nodejs入门教程之连接数据库的方法,结合实例形式分析了nodejs连接数据库的具体步骤与相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • nodejs实现连接mongodb数据库的方法示例

    nodejs实现连接mongodb数据库的方法示例

    这篇文章主要介绍了nodejs实现连接mongodb数据库的方法,结合实例形式分析了nodejs针对mongodb数据库的简单连接、查询及关闭等操作技巧,需要的朋友可以参考下
    2018-03-03
  • nodejs实现大文件(在线视频)的读取

    nodejs实现大文件(在线视频)的读取

    这篇文章主要为大家详细介绍了nodejs实现大文件的读取,比如在线视频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Node.js v8.0.0正式发布!看看带来了哪些主要新特性

    Node.js v8.0.0正式发布!看看带来了哪些主要新特性

    Node.js v8.0.0 已正式发布。v8.0.0 是下一个主要的版本,带来了一系列重大的变化和新功能,内容十分多!下面这篇文章主要带着大家一起看看Node.js v8.0.0带来了哪些主要新特性,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-06-06
  • 最新评论

    常用在线小工具

  • 三狮军团首秀 只有两千多球迷观战 2019-05-19
  • 人民网2017呼和浩特徒步迎新活动--内蒙古频道--人民网 2019-05-19
  • 【品牌资讯】环球网斩获“全国行业新闻网站传播力2017年6月榜”多项冠军 2019-05-15
  • 深化对经济工作主线的认识 从供需关系看供给侧结构性改革 2019-05-15
  • 格拉斯哥艺术学院起火 4年前曾遭火灾仍在整修 2019-05-14
  • 回复@地瓜干17世:猪临死才会嚎叫呢~ 2019-05-14
  • 婺源古村溪中发现鹰嘴龟 2019-05-08
  • 编辑评测:高夫净源控油平衡露 极速补水长效控油 2019-05-08
  • 四部门发文规范特色小镇建设防止“新瓶装旧酒” 2019-05-02
  • 【地球的盛会文明的聚会艺术的盛宴四海一家足球为人类和平幸福而荣耀!!!普京是当今人类世界最优秀的一代伟人俄罗斯赢啦!!!】 2019-04-29
  • 学习新思想,千万师生同上一堂课 2019-04-28
  • 你这种个体户都干不了的老蚕也配谈计划?真是笑死人不偿命哦? 2019-04-23
  • 感人!的哥带着患病父亲出车 孝心感动乘客 2019-04-23
  • 图解:习近平在纪念马克思诞辰200周年大会上讲话的16个金句 2019-04-16
  • 感触名家笔下的端午文化 吃香粽原来可以这样"文艺" 2019-04-16
  • 北京pk10计算法 大乐透走势图最近2500 极速时时彩计划群 排列五开奖结果查询 重庆百变王牌计划群 彩经网河内五分彩走势图 北京单场动画直播 重庆幸运农场直播 北京pk10走势图表 福彩之“生肖时时彩 手机最快报码室 北京赛车pk10冠亚计划 3d试机号今晩上金码关注吗 北京快乐8任一计划 排列 500万彩票网澳客网