深入理解Node.js中通用基础设计模式


Posted in Javascript onSeptember 19, 2017

谈到设计模式,你可能会想到 singletons, observers(观察者) 或 factories(工厂方法)。本文不并专门探讨他们。只是探讨Node.JS一些基础模式的实现,像依赖注入或中间件。

什么是设计模式?

设计模式是用来解决一般的,普遍发生的问题,且可重复使用的解决方案。

Singletons (单例)

Singletons模式限制了“类”,只有一个实例。在Node.js的创建单例是非常简单的,比如下面这个require。

//area.js
var PI = Math.PI;
function circle (radius) { 
 return radius * radius * PI;
}
module.exports.circle = circle;

你引用多少次都没有关系;它将只存在一个单一的实例。

var areaCalc = require('./area');
console.log(areaCalc.circle(5));

由于 require 的这种实现,单例可能在NPM模块中最常见的Node.js设计模式。

Observers(观察者)

一个维护了侦听/观察列表的对象,当状态改变时会自动通知他们。为了实现观察者模式,EventEmitter就派上用场了。

// MyFancyObservable.js
var util = require('util'); 
var EventEmitter = require('events').EventEmitter;
function MyFancyObservable() { 
 EventEmitter.call(this);
}
util.inherits(MyFancyObservable, EventEmitter);

就是这个;我们实现了一个可观察的对象!为了用它,让我们添加一些方法吧。

MyFancyObservable.prototype.hello = function (name) { 
 this.emit('hello', name);
};

太好了,试试侦听并响应这个事件!

var MyFancyObservable = require('MyFancyObservable'); 
var observable = new MyFancyObservable();
observable.on('hello', function (name) { 
 console.log(name);
});
observable.hello('john');

Factories (工厂方法)

工厂模式是一种创建者模式,不需要我们使用构造函数,它提供用于创建对象的通用接口。这种模式可以用于生成创建过程非常复杂的对象。

function MyClass (options) { 
 this.options = options;
}
function create(options) { 
 // modify the options here if you want
 return new MyClass(options);
}
module.exports.create = create;

工厂可以让测试更简单,因为你可以在里面注入依赖关系。

Dependency Injection 依赖注入

依赖注入是将其中的一个或多个依赖(或服务)注入,或通过引用传递到从属对象的设计模式。

在这个例子中,我们将创建一个的usermodel它获取数据库的依赖。

function userModel (options) { 
 var db;
 if (!options.db) {
  throw new Error('Options.db is required');
 }
 db = options.db;
 return {
  create: function (done) {
   db.query('INSERT ...', done);
  }
 }
}
module.exports = userModel;

现在,我们利用它创建一个实例:

var db = require('./db');
var userModel = require('User')({ 
 db: db
});

它为什么有用呢?它使测试变得更容易 - 当你写单元测试时,你可以把假的数据库实例注入模型。

Middlewares/pipelines 中间件/管道

中间件是一个强大功能且简单的概念:一个功能单元的输出是下一个功能单元的输入。如果你用过Express那么你已经使用了这个模式。

我们看一看 Koa 是如何做的:

app.use = function(fn){ 
 this.middleware.push(fn);
 return this;
};

所以基本上,当你添加一个中间件时,它只是被压入一个中间件队列中。但是当一个请求到达这个服务器会发生什么?

var i = middleware.length; 
while (i--) { 
 next = middleware[i].call(this, next);
}

没什么神奇的 - 你的中间件被一个接着一个调用了。

Streams

你可以把流作为特殊的管道。他比较适合处理大量数据流,即他们是字节,而不是对象。

process.stdin.on('readable', function () { 
  var buf = process.stdin.read(3);
  console.dir(buf);
  process.stdin.read(0);
});

总结

以上所述是小编给大家介绍的Node.js中通用基础设计模式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
User Scripts: Video Download by User Scripts
May 14 Javascript
图片在浏览器中底部对齐 解决方法之一
Nov 30 Javascript
jQuery替换textarea中换行的方法
Jun 10 Javascript
EasyUI Pagination 分页的两种做法小结
Jul 09 Javascript
浅谈angular懒加载的一些坑
Aug 20 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
Sep 18 Javascript
微信小程序录音与播放录音功能
Dec 25 Javascript
redux-saga 初识和使用
Mar 10 Javascript
vue实现的组件兄弟间通信功能示例
Dec 04 Javascript
vue实现form表单与table表格的数据关联功能示例
Jan 29 Javascript
js验证账户名是否重复
May 26 Javascript
Vue按时间段查询数据组件使用详解
Aug 21 Javascript
微信小程序媒体组件详解(视频,音乐,图片)
Sep 19 #Javascript
Javascript中将变量转换为字符串的三种方法
Sep 19 #Javascript
详解JS中的this、apply、call、bind(经典面试题)
Sep 19 #Javascript
JavaScript 中的 this 简单规则
Sep 19 #Javascript
在 Node.js 中使用原生 ES 模块方法解析
Sep 19 #Javascript
Webpack 服务器端代码打包的示例代码
Sep 19 #Javascript
原生js中ajax访问的实例详解
Sep 19 #Javascript
You might like
PHP截取指定图片大小的方法
2014/12/10 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
php使用curl伪造浏览器访问操作示例
2019/09/30 PHP
javascript 一些用法小结
2009/09/11 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
2010/12/28 Javascript
script的async属性以非阻塞的模式加载脚本
2013/01/15 Javascript
jQuery的Ajax的自动完成功能控件简要说明
2013/02/22 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
2014/04/10 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
Jquery UI实现一次拖拽多个选中的元素操作
2020/12/01 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
2017/04/05 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
Vue的MVVM实现方法
2017/08/16 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
通过javascript实现扫雷游戏代码实例
2020/02/09 Javascript
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
对于Python编程中一些重用与缩减的建议
2015/04/14 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
详解python中eval函数的作用
2019/10/22 Python
python:动态路由的Flask程序代码
2019/11/22 Python
Python 音频生成器的实现示例
2019/12/24 Python
python与pycharm有何区别
2020/07/01 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
LookFantastic丹麦:英国美容护肤精品在线商城
2016/08/18 全球购物
照片礼物和装饰:MyPhoto
2019/11/02 全球购物
应届毕业生的个人自我鉴定
2013/10/24 职场文书
大学生自我鉴定评语
2014/01/27 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
银行求职信范文
2014/05/26 职场文书
新教师岗前培训方案
2014/06/05 职场文书
2019同学聚会主持词
2019/05/06 职场文书
css3应用示例:新增的选择器
2022/03/16 HTML / CSS