今天要做的是首先要整理代码,在现有的代码基础上抽理出一个 Applicatin 类可以作为客户端和服务端共同使用,通过不同的上下文完成不同的工作。

创建 Applicatin 类

export default class Application{    constructor(routes, options){        this.server = options.server;        this.registerRoutes(routes);    }    registerRoutes(routes){        for(let path in routes){            this.addRoute(path, routes[path]);        }    }    addRoute(path, handler){        this.server.route({            path:path,            method:'GET',            handler:handler        });    }    start(){        this.server.start();    }}

在构造函数中接收两个参数 routes 和 option ,option 提供给 Application 应用一个上下文,如果在服务端我们就提供给一个 server 供 Application 调用。routes 是路由对象,对象每一个属性为 url 而属性值是处理这个 url 的处理方法。

{  url:handler}
    constructor(routes, options){        this.server = options.server;        this.registerRoutes(routes);    }

遍历 routes 对象,将 url和 处理函数传入给 addRoute 进行处理

    registerRoutes(routes){        for(let path in routes){            this.addRoute(path, routes[path]);        }    }

将 url 和其对应处理方法传递给 server 也就是将 hapi 的服务器处理,这里不做过多解释,相信大家一看就应该能懂。

    addRoute(path, handler){        this.server.route({            path:path,            method:'GET',            handler:handler        });    }

导入创建好的应用类

将代码拆分到 Application 之后,我们来看一看怎么使用他。导入后实例化一个 Application 来替换原有相同功能部分的代码。

import Application from './lib';

初始化一个 application 的实例

const App = new Application({    '/hello/{title}/{author}':function(request,reply){        render('/index.html',request,reply,getTutInfo(request));    }},{    server:server})

创建控制器接口

接触过服务端开发的朋友一定对控制器,并不陌生控制器具体作用是来处理路由,为了让我们程序更接近真实,接近于企业级应用,我们这里把处理函数代码整理出来做为控制器来使用,因为控制器可能也会复用到客户端所以我们先定义一个接口,这里所谓的接口就是一个 Controller 基础类,子类要实现其方法。

export default class Controller {    constructor(context){        this.context = context;    }    index(application, request, reply, callback){        callback(null);    }    toString(callback){        callback(null,'sucess');    }}
  • index 方法是我们路由处理函数
  • toString 是我们随后可能只会替换模板部分代码时所用生成 html 字符串的方法,随后通过使用就可以知道他具体怎么用。
const App = new Application({    '/hello/{title}/{author}':Controller},{    server:server});

接下来我们创建一个继承(扩展)了 Controller 类的 HelloController 的控制器来处理具体 url。

import Controller from "./controller";import nunjucks from "nunjucks";export default class HelloController extends Controller{    toString(callback){        nunjucks.renderString('

{{title}} {{author}}

',getTutInfo(this.context),function(err,html){ if(err){ return callback(err,null); } callback(null,html); }) }}function getTutInfo(request){ console.log(request); let tutInfo = { title: 'basic angular', author:'tina' } let title = request.params.title; let author = request.params.author; return { title:title?title:'default title', author:author?author:'default author' }}

import Controller from "./controller";import HelloController from "./hello-controller";export default class Application{    constructor(routes, options){        this.server = options.server;        this.registerRoutes(routes);        this.document = options.document;    }    registerRoutes(routes){        for(let path in routes){            this.addRoute(path, routes[path]);        }    }    addRoute(path, controller){        this.server.route({            path:path,            method:'GET',            handler:(request,reply) => {                const controller = new HelloController({                    query:request.query,                    params:request.params                });                controller.index(this,request,reply,(err)=>{                    if(err){                        return reply(err);                    }                    controller.toString((err,html)=>{                        if(err){                            return reply(err);                        }                        this.document(this,controller,request,reply,html, function(err,html){                            if(err){                                return reply(err)                            }                                            reply(html);                        });                    });                });            }        });    }    start(){        this.server.start();    }}

上面的代码看起来很复杂,其实并没有你想象的那么复杂,controller.index 方法中调用了 controller.toString 方法,然后最后再调用 this.document (如下)这个具体实现的方法来完成最终渲染。

const App = new Application({    '/hello/{title}/{author}':HelloController},{    server:server,    document:function(application,controller,request,reply,body,callback){        nunjucks.render("index.html",{body:body},(err,html)=>{            if(err){                return callback(err,null);            }            console.log(html);            callback(null,html);        });    }});

ios传感器应用开发最佳实践_同构 javascript 应用开发的最佳实践(Four)相关推荐

  1. web前端开发最佳实践_学习前端Web开发的最佳方法

    web前端开发最佳实践 为什么要进行网站开发? (Why web development?) Web development is a field that is not going anywhere ...

  2. 快速交付 敏捷开发的特点_什么是敏捷开发?它有什么特点

    原标题:什么是敏捷开发?它有什么特点 随着软件开发技术的不断发展,现在出现了很多种不同的开发模式,其实敏捷开发已经成为现在很多企业开发应用程序都想要选择的开发方案.那么什么是敏捷开发呢?下面一起来了解 ...

  3. 安卓开发大作业_罗湖小程序开发制作价格低

    罗湖小程序开发制作价格低 深圳市驰骋网络技术有限公司 驰骋网络提供外观结构设计+软硬件+APP+云服务 一站式开发服务 小程序开始走入了人们的视线,由于其独特的便捷性,给我们的生活提供了非常大的帮助, ...

  4. java 开发多店铺_基于SpringBoot+Thymeleaf开发的多店铺商城后台管理系统

    系统简介 JavaWeb专业版,企业级开发框架SpringBoot+Layui+Thymeleaf+MybatisPlus开发权限(RBAC)及内容管理框架,框架中集成了权限管理.模块管理,数据库管理 ...

  5. 原生开发什么意思_什么是原生开发?什么是混合开发?两者有什么区别?

    各行各业都已经转型进入互联网发展,面对这个必然趋势,普通行业线下销售模式已经是走不通了,眼看大家都在往互联网上转型.也都有了自己的网上平台店铺或APP,自己想开发一款APP,但是又不了解行情,对于原生 ...

  6. android开发小项目实例_微信小程序开发的实例教程

    一.注册小程序帐户 1.进入微信公众平台,注册一个小程序帐号,并根据提示填写相应的信息. 2.成功注册后,进入主页,然后在小程序发布过程->小程序开发和管理->配置服务器中单击" ...

  7. android studio开发app实例_基于Android输入法开发,制作一个微信斗图APP

    刘望舒 读完需要 20分钟 速读仅需12分钟 作者:小学生° 来源:搜狐技术产品 01 导读 微信斗图的应用有很多,但大部分都是通过微信分享来实现的,需下载 APP,下载表情并分享到微信联系人,操作步 ...

  8. tomcat 参数最佳实践_一线架构师开发总结:剖析并发编程+JVM性能,深入Tomcat与MySQL...

    每一个程序员都有自己清晰的职业规划和终极目标,无论之后是继续钻研技术,还是转管理岗.产品岗,都是需要自己具备有一定的实力,换句话说技术要牛逼.架构师,是很多程序员的终极目标,而成为一名Java架构师, ...

  9. 数据模型最佳实践_数据科学家应了解软件工程最佳实践

    数据模型最佳实践 意见 (Opinion) 介绍 (Introduction) I have been eagerly researching, speaking to friends and tes ...

最新文章

  1. 魔兽世界---屠夫(Just a Hook)
  2. mac mysql 初始密码_mac下mysql安装后修改默认密码
  3. 转 sql server性能分析--执行sql次数和逻辑次数
  4. 用 IIS 进行ASP.NET 成员/角色管理(1):安全和配置概述
  5. 斐讯T1刷机详细指南
  6. Java API 帮助文档中英文版下载
  7. PyTorch学习笔记(10)——上采样和PixelShuffle
  8. VSCode取消注释斜体
  9. 如何批量一键下单寄快递
  10. Dogfight :从无人机视频中检测无人机
  11. 冯诺曼伊体系 计算机五大逻辑,科学网—再谈冯·诺伊曼结构 - 姜咏江的博文
  12. IBM类脑超算平台TrueNorth芯片将于本周送往劳伦斯利弗莫尔
  13. 2021第六届天梯赛cccc总决赛题解
  14. Saiku控制页面展示的数据过长自动换行(二十四)
  15. 串口通信与网口通信简介
  16. 浅谈企业网络安全边界
  17. 计算机管理声音视屏不见,为什么视频没声音_电脑看视频没声音怎么恢复-win7之家...
  18. 什么叫低格?怎样执行
  19. python代码宠物_和孩子一起做一只电子宠物吧!
  20. 迭代器模式——电视遥控器的实现

热门文章

  1. cte公用表表达式_在SQL Server中使用CTE进行插入和更新(公用表表达式)
  2. dmf nmf_SQL Server 2019 –新的DMF sys.dm_db_page_info
  3. linux 配置 tmux
  4. MySQL 取得两个时间相差的分钟数 及 常用时间函数
  5. k8s的应用打包工具Helm
  6. Django 视图层
  7. linux进程的创建、执行和消亡
  8. ubuntu安装Pillow
  9. WebPack常用功能介绍
  10. java error:编码gbk的不可映射字符