JavaScript
MongoDB
NoSQL
引用
数组
集合
数据库
mongoose
MongoDB 是典型的 NoSQL 数据库,因此不提供 JOIN 操作。
但有时我们仍然希望引用其他集合中的文档。此时便需要外键填充(population)。
mongoose 是极具 JavaScript 特点的程序库,提供了极其简单和强大的填充功能。
mongoose 不仅支持填充单个文档,也支持多文档,甚至直接填充某个对象。
本文中部分代码来自 mongoose 文档。
外键引用
在 Schema 字段的定义中,可以添加 ref
属性来指向另一个 Schema。
该 ref
属性在此后被填充(populate
)时将被 mongoose 读取。
下面是存在互相引用的 Person
与 Story
的 Schema 定义。
var mongoose = require('mongoose'), Schema = mongoose.Schema
var personSchema = Schema({
// _id默认为Schema.Types.ObjectId类型
_id : Number,
name : String
});
var storySchema = Schema({
creator : { type: Number, ref: 'Person' },
title : String,
// 可以看到外键引用可以定义在嵌套的属性中。
fans : [{ type: Number, ref: 'Person' }]
});
var Story = mongoose.model('Story', storySchema);
var Person = mongoose.model('Person', personSchema);
Node.js
缓存
工厂方法
Mocha
Express.js
测试
supertest提供了简单易用的客户代理,可以方便地用来测试Express.js应用。
本文介绍如何在Mocha中使用supertest,
以及测试 Express.js 应用涉及到的一些问题:
包括如何在每个测试项之前正确地关闭上一个Express.js Server,
以及如何避免require
缓存造成的环境差异。
事件
异常
类型检查
测试
Mocha
测试桩
Mock
在利用 Mocha 进行 BDD 风格测试一文中介绍了Mocha测试框架的使用,
其中略过了before()
, beforeEach()
等钩子。
本文介绍在Mocha下如何利用这些钩子构建测试上下文,
以及如何使用Sinonjs构建测试桩。
Sinonjs
事实上Sinonjs提供了三种测试桩:Spies, Stubs, Mocks。
以及一些虚拟环境:Timers、JSONP、XHR等。
本文着重介绍如何利用Spies和Stubs的使用。
文档:
安装:
npm install --save-dev sinon
JavaScript
封装
defineProperty
ES5定义的Object.defineProperty()方法提供了面向对象实现中
『属性』的概念,类似于C#的属性(Property),或Java的访问器(Accessor)。
『属性』可以用来隐藏内部变量,实现写保护和读写钩子,从而加强对象封装。
ES5为此给出了一系列的对象属性管理方法,包括:Object.defineProperty
,
Object.preventExtensions
, Object.seal
, Object.freeze
等。
defineProperty参数
Object.defineProperty(obj, prop, descriptor)
用于在对象obj
上添加(或修改)
名为prop
的属性,该方法接受三个参数:
obj
:需要定义属性的对象
prop
:属性名,字符串类型
descriptor
:属性描述符,对象类型。
可以通过descriptor
可以精确地控制该属性的行为,
该描述符可以分为数据描述符和存取描述符两种。它们具有不同的属性,不可混用。
Linux
Vim
寄存器
常见文本编辑器都会提供剪切板来支持复制粘贴,Vim 也不例外。
不同的是 Vim 提供了 10 类共 48 个寄存器,提供无与伦比的寄存功能。
最常用的 y
操作将会拷贝到默认的匿名寄存器中,我们也可以指定具体拷贝到哪个寄存器中。
一般来讲,可以用 "{register}y
来拷贝到 {register}
中,
用 "{register}p
来粘贴 {register}
中的内容。例如:
"ayy
可以拷贝当前行到寄存器 a
中,而 "ap
则可以粘贴寄存器 a
中的内容。
字符串
正则表达式
正则表达式(Regular Expression,RegExp,regex)使用单个字符串来描述和匹配一系列符合某种句法规则的字符串。此概念来自形式化语言理论,最初由贝尔实验室实现。
正则表达式最初在Perl中实现,它的推广得益于UNIX软件的流行,尤其是SED,GREP等。
现在许多编程语言都内置了正则表达式引擎,如PERL、Python、JavaScript、Java、C++11等。
很多文本编辑器也支持正则表达式来进行检索和替换(尤其是Vim!)。
JavaScript
NPM
Promise
回调函数
Chai
Mocha
测试
BDD
异步
在 利用 Mocha 进行 BDD 风格测试 中介绍了 Mocha 测试框架和
Chai 断言库的使用。JavaScript 天生就是异步的,
这意味着在 JavaScript 测试中往往会需要异步断言。
本文介绍如何使用 Chai 和 chai-as-promised 来测试 Promise。
Mocha 测试异步代码
Mocha 本身是支持异步测试的。只需要为 describe
回调函数添加一个 done
参数,
成功时调用 done()
,失败时调用 done(err)
。例如:
var expect = require('chai').expect;
describe('db', function() {
it('#get', function(done) {
db.get('foo', function(err, foo){
if(err) done(err);
expect(foo).to.equal('bar');
done();
});
});
});