<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Marshal&#039;s Blog</title>
	<atom:link href="http://marshal.easymorse.com/feed" rel="self" type="application/rss+xml" />
	<link>http://marshal.easymorse.com</link>
	<description>It&#039;s swap of marshal&#039;s memory.</description>
	<lastBuildDate>Fri, 18 May 2012 06:21:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>nodejs下的行为驱动开发</title>
		<link>http://marshal.easymorse.com/archives/4995?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nodejs%25e4%25b8%258b%25e7%259a%2584%25e8%25a1%258c%25e4%25b8%25ba%25e9%25a9%25b1%25e5%258a%25a8%25e5%25bc%2580%25e5%258f%2591</link>
		<comments>http://marshal.easymorse.com/archives/4995#comments</comments>
		<pubDate>Fri, 18 May 2012 06:21:52 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mocha]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[should.js]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/?p=4995</guid>
		<description><![CDATA[行为驱动开发：英文缩写BDD，详细介绍可参见这里。 测试驱动开发 以前，我一般用TDD（测试驱动开发）来做服务器端，以确保开发质量，以及提高开发速度。 很多人的体会是写测试用例是延缓了开发进度。也许是开发场景不一样，或者是没有熟练的使用测试驱动开发的技巧。 先写测试用例，然后写实现代码，完成一点功能，就运行测试用例，多次测试的情况下（回归测试），所花时间肯定比每次都手工测试来的少。 这里的关键是，首先要写测试代码，再写正式代码，这样正式代码的每次测试都使用测试程序来测试。 我怎么看BDD 我也不知道，老实话，我也才用这个东西。我是想找一个nodejs环境下比较普及的测试框架，结果看到Mocha，它的测试可以引用BDD概念，我才决定试一试的。 也许，用一段时间，我会发现它确实比TDD好的地方。 BDD测试准备步骤 我是在写nodejs代码，编写了操作mongodb的代码模块，见在dao代码中使用异常。我需要一个对该模块的测试程序，确保这个模块在逐步发展的时候，有足够的自动回归测试来保证该模块的质量。 我找到了Mocha（它的作者也编写了express），可能是目前比较普及的这方面框架。该框架可执行TDD，也可执行BDD。Mocha本身可以使用第三方的断言库，当然，作者自己写了个基于BDD的断言库，should.js。 我的测试就是使用了Mocha和should.js。 首先要安装Mocha和should.js。Mocha安装： npm install -g mocha 安装should.js： npm install should 然后，在项目中建立test目录。 之后可以在项目根目录下命令行下运行一下mocha： $ mocha 运行后，什么也没有发生，因为mocha扫描了test目录下，未找到可执行的测试脚本。 但是，我们的环境搭建好了。 编写最简单的BDD测试 编写一个最简单的测试代码。说明如何使用mocha和should.js。 首先代码中需要should模块： require(&#8216;should&#8217;); 然后，我们假设要测试一个对象是否和另外一个对象相等： var book = {name:”枪炮、病毒和钢铁”}; describe(&#8216;Book&#8217;, function () { it(&#8216;图书应该应该一致&#8217;, function () { var newBook={name:”枪炮、病毒和钢铁”}; newBook.should.eql(book); }); }); 再次命令行运行mocha，会有类似这样的输出： $ mocha . ✔ [...]]]></description>
			<content:encoded><![CDATA[<p>行为驱动开发：英文缩写BDD，详细介绍可<a href="http://zh.wikipedia.org/wiki/%E8%A1%8C%E4%B8%BA%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91">参见这里</a>。</p>
<h3>测试驱动开发</h3>
<p>以前，我一般用TDD（测试驱动开发）来做服务器端，以确保开发质量，以及提高开发速度。</p>
<p>很多人的体会是写测试用例是延缓了开发进度。也许是开发场景不一样，或者是没有熟练的使用测试驱动开发的技巧。</p>
<p>先写测试用例，然后写实现代码，完成一点功能，就运行测试用例，多次测试的情况下（回归测试），所花时间肯定比每次都手工测试来的少。</p>
<p>这里的关键是，首先要写测试代码，再写正式代码，这样正式代码的每次测试都使用测试程序来测试。</p>
<h3>我怎么看BDD</h3>
<p>我也不知道，老实话，我也才用这个东西。我是想找一个nodejs环境下比较普及的测试框架，结果看到Mocha，它的测试可以引用BDD概念，我才决定试一试的。</p>
<p>也许，用一段时间，我会发现它确实比TDD好的地方。</p>
<p><span id="more-4995"></span></p>
<h3>BDD测试准备步骤</h3>
<p>我是在写nodejs代码，编写了操作mongodb的代码模块，见<a href="http://marshal.easymorse.com/archives/4991" title="在dao代码中使用异常">在dao代码中使用异常</a>。我需要一个对该模块的测试程序，确保这个模块在逐步发展的时候，有足够的自动回归测试来保证该模块的质量。</p>
<p>我找到了<a href="http://visionmedia.github.com/mocha/">Mocha</a>（它的作者也编写了express），可能是目前比较普及的这方面框架。该框架可执行TDD，也可执行BDD。Mocha本身可以使用第三方的断言库，当然，作者自己写了个基于BDD的断言库，<a href="https://github.com/visionmedia/should.js">should.js</a>。</p>
<p>我的测试就是使用了Mocha和should.js。</p>
<p>首先要安装Mocha和should.js。Mocha安装：</p>
<blockquote><p>npm install -g mocha</p></blockquote>
<p>安装should.js：</p>
<blockquote><p>npm install should</p></blockquote>
<p>然后，在项目中建立test目录。</p>
<p>之后可以在项目根目录下命令行下运行一下mocha：</p>
<blockquote><p>$ mocha</p></blockquote>
<p>运行后，什么也没有发生，因为mocha扫描了test目录下，未找到可执行的测试脚本。</p>
<p>但是，我们的环境搭建好了。</p>
<h3>编写最简单的BDD测试</h3>
<p>编写一个最简单的测试代码。说明如何使用mocha和should.js。</p>
<p>首先代码中需要should模块：</p>
<blockquote><p>require(&#8216;should&#8217;);</p></blockquote>
<p>然后，我们假设要测试一个对象是否和另外一个对象相等：</p>
<blockquote><p>var book = {name:”枪炮、病毒和钢铁”};</p>
<p>describe(&#8216;Book&#8217;, function () {<br />
it(&#8216;图书应该应该一致&#8217;, function () {<br />
var newBook={name:”枪炮、病毒和钢铁”};<br />
newBook.should.eql(book);<br />
});<br />
});</p></blockquote>
<p>再次命令行运行mocha，会有类似这样的输出：</p>
<blockquote><p>$ mocha</p>
<p>.</p>
<p>✔ 1 test complete (3ms)</p></blockquote>
<p>如果故意将name写的不一致，可能会有类似这样的报错：</p>
<blockquote><p>mocha</p>
<p>.</p>
<p>✖ 1 of 1 test failed:</p>
<p>1) Book 图书应该应该一致:<br />
AssertionError: expected {} to equal { name: &#8216;枪炮、病毒和钢铁&#8217; }</p></blockquote>
<h3>编写正式的测试代码</h3>
<p>下面写真的了，要测试DocProvider.js的逻辑是否正确。</p>
<p>在test目录下创建DbTest.js：</p>
<blockquote><p>require(&#8216;should&#8217;);<br />
var DocProvider = require(&#8216;../lib/db/DocProvider&#8217;).DocProvider;</p>
<p>var bookProvider = new DocProvider(&#8216;books&#8217;);</p>
<p>describe(&#8216;DocProvider&#8217;, function () {<br />
var book = {<br />
name:&#8217;钱的历史&#8217;<br />
};</p>
<p>describe(&#8216;#insert&#8217;, function () {<br />
bookProvider.insert(book, {}, function (result) {<br />
it(&#8216;图书应该有_id属性&#8217;, function () {<br />
result[0].should.have.property(&#8216;_id&#8217;);<br />
});</p>
<p>describe(&#8216;#findOne&#8217;, function () {<br />
it(&#8216;读取的图书应该和插入的对象一致&#8217;, function (done) {<br />
bookProvider.findOne({_id:book._id}, {}, function (result) {<br />
result.should.eql(book);<br />
done();<br />
});<br />
});<br />
});<br />
});<br />
});<br />
});</p></blockquote>
<p>这里需要注意的是，对于异步执行的函数，要使用：</p>
<blockquote><p>it(&#8216;读取的图书应该和插入的对象一致&#8217;, function (<em><strong>done</strong></em>) {</p></blockquote>
<p>另外，在异步内容执行完毕后：</p>
<blockquote><p>result.should.eql(book);<br />
<em><strong>done();</strong></em></p></blockquote>
<p>否则，测试执行不等待异步执行完就结束了。</p>
<p>完整的源代码可参见这里：<a href="https://github.com/MarshalW/HelloExpress/tree/v0.2">https://github.com/MarshalW/HelloExpress/tree/v0.2</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/4995/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在dao代码中使用异常</title>
		<link>http://marshal.easymorse.com/archives/4991?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%259c%25a8dao%25e4%25bb%25a3%25e7%25a0%2581%25e4%25b8%25ad%25e4%25bd%25bf%25e7%2594%25a8%25e5%25bc%2582%25e5%25b8%25b8</link>
		<comments>http://marshal.easymorse.com/archives/4991#comments</comments>
		<pubDate>Wed, 16 May 2012 14:17:42 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/?p=4991</guid>
		<description><![CDATA[在在nodejs应用中抛出异常只是给出了实现的设想。 在这里：https://github.com/MarshalW/HelloExpress/tree/v0.1 ，给出了具体的实现。 见lib/db目录下的两个代码： Config.js ，用于配置db模块的参数等； DocProvider.js，实现对mongodb的dao封装，示意性的实现，只实现了getCollection和insert 在app.js最后部分，是对该模块的调用： var book={name:&#8217;枪炮、病毒和钢铁&#8217;}; var docProvider=new DocProvider(&#8216;books&#8217;); docProvider.insert(book,{},function(result){     console.log(&#8216;insert ok.&#8217;); }); 这样实现的目的是，抽象dao部分，便于api方式的复用，而不是继承方式的复用。另外，演示了异常的处理，callback不在需要处理错误。]]></description>
			<content:encoded><![CDATA[<p>在<a href="http://marshal.easymorse.com/archives/4984" title="在nodejs应用中抛出异常">在nodejs应用中抛出异常</a>只是给出了实现的设想。</p>
<p>在这里：<a href="https://github.com/MarshalW/HelloExpress/tree/v0.1">https://github.com/MarshalW/HelloExpress/tree/v0.1</a> ，给出了具体的实现。</p>
<p>见lib/db目录下的两个代码：</p>
<ul>
<li>Config.js ，用于配置db模块的参数等；</li>
<li>DocProvider.js，实现对mongodb的dao封装，示意性的实现，只实现了getCollection和insert</li>
</ul>
<p>在app.js最后部分，是对该模块的调用：</p>
<blockquote>
<div id="LC40">var book={name:&#8217;枪炮、病毒和钢铁&#8217;};</div>
<div id="LC41">var docProvider=new DocProvider(&#8216;books&#8217;);</div>
<div id="LC42">docProvider.insert(book,{},function(result){</div>
<div id="LC43">    console.log(&#8216;insert ok.&#8217;);</div>
<div id="LC44">});</div>
</blockquote>
<div>这样实现的目的是，抽象dao部分，便于api方式的复用，而不是继承方式的复用。另外，演示了异常的处理，callback不在需要处理错误。</div>
<div></div>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/4991/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nodejs中使用断言</title>
		<link>http://marshal.easymorse.com/archives/4989?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nodejs%25e4%25b8%25ad%25e4%25bd%25bf%25e7%2594%25a8%25e6%2596%25ad%25e8%25a8%2580</link>
		<comments>http://marshal.easymorse.com/archives/4989#comments</comments>
		<pubDate>Wed, 16 May 2012 13:09:41 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/?p=4989</guid>
		<description><![CDATA[如果写测试代码，就离不开断言，assertion。或者，也有人在正式代码中使用断言，来减少因为接受不正确的值产生的错误。 在nodejs中能找到assertion模块。 写法类似这样： var assert=require(&#8216;assert&#8217;); assert.equal(1,2); equal接收两个参数，如果相等，就过去，否则抛出异常，类似这样： AssertionError: 1 == 2 at Object.&#60;anonymous&#62; (/Users/marshal/WebstormProjects/HelloExpress/app.js:66:8)]]></description>
			<content:encoded><![CDATA[<p>如果写测试代码，就离不开断言，assertion。或者，也有人在正式代码中使用断言，来减少因为接受不正确的值产生的错误。</p>
<p>在nodejs中能找到assertion模块。</p>
<p>写法类似这样：</p>
<blockquote><p>var assert=require(&#8216;assert&#8217;);<br />
assert.equal(1,2);</p></blockquote>
<p>equal接收两个参数，如果相等，就过去，否则抛出异常，类似这样：</p>
<blockquote><p>AssertionError: 1 == 2<br />
at Object.&lt;anonymous&gt; (/Users/marshal/WebstormProjects/HelloExpress/app.js:66:8)</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/4989/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在nodejs应用中抛出异常</title>
		<link>http://marshal.easymorse.com/archives/4984?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%259c%25a8nodejs%25e5%25ba%2594%25e7%2594%25a8%25e4%25b8%25ad%25e6%258a%259b%25e5%2587%25ba%25e5%25bc%2582%25e5%25b8%25b8</link>
		<comments>http://marshal.easymorse.com/archives/4984#comments</comments>
		<pubDate>Wed, 16 May 2012 12:25:56 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/?p=4984</guid>
		<description><![CDATA[在javascript通过闭包回调是非常容易的。下面一段代码来自正式项目中，基于express，操作mongodb： DataProvider.prototype.getCollection = function (callback) { this.db.collection(this.collectionName, function (err, collection) { if (err) callback(err); 在操作mongodb中，类似的代码很多。问题在于，callback函数负担很重，既要执行业务正常逻辑，又要处理是否有错误。这让程序员编码负担很重，往往不编写对错误的处理。这样一旦有错误，程序还继续执行业务逻辑，带来混乱。 其实，这里一旦有错误，业务逻辑也是无法继续执行的。那么，直接抛异常吧。参见在javascript中使用异常。 可写成类似这样： DataProvider.prototype.getCollection = function (callback) { this.db.collection(this.collectionName, function (err, collection) { if (err) throw(err); callback(collection); 这样，调用该方法的写法是： DataProvider.prototype.update = function (selector, document, options, callback) { this.getCollection(function (collection) { collection.update(selector, document, options, function(err, result) { if (err) throw(err); callback(result); }); }); [...]]]></description>
			<content:encoded><![CDATA[<p>在javascript通过闭包回调是非常容易的。下面一段代码来自正式项目中，基于express，操作mongodb：</p>
<blockquote><p>DataProvider.prototype.getCollection = function (callback) {<br />
this.db.collection(this.collectionName, function (err, collection) {<br />
if (err) callback(err);</p></blockquote>
<p>在操作mongodb中，类似的代码很多。问题在于，callback函数负担很重，既要执行业务正常逻辑，又要处理是否有错误。这让程序员编码负担很重，往往不编写对错误的处理。这样一旦有错误，程序还继续执行业务逻辑，带来混乱。</p>
<p>其实，这里一旦有错误，业务逻辑也是无法继续执行的。那么，直接抛异常吧。参见<a href="http://marshal.easymorse.com/archives/4982" title="在javascript中使用异常">在javascript中使用异常</a>。</p>
<p>可写成类似这样：</p>
<blockquote><p>DataProvider.prototype.getCollection = function (callback) {<br />
this.db.collection(this.collectionName, function (err, collection) {<br />
if (err) throw(err);<br />
callback(collection);</p></blockquote>
<p>这样，调用该方法的写法是：</p>
<blockquote><p>DataProvider.prototype.update = function (selector, document, options, callback) {<br />
this.getCollection(function (collection) {<br />
collection.update(selector, document, options, function(err, result) {<br />
if (err) throw(err);<br />
callback(result);<br />
});<br />
});</p></blockquote>
<p>这样就可不必在每个callback中写重复的劳什子错误处理了。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/4984/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在javascript中使用异常</title>
		<link>http://marshal.easymorse.com/archives/4982?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%259c%25a8javascript%25e4%25b8%25ad%25e4%25bd%25bf%25e7%2594%25a8%25e5%25bc%2582%25e5%25b8%25b8</link>
		<comments>http://marshal.easymorse.com/archives/4982#comments</comments>
		<pubDate>Wed, 16 May 2012 11:29:19 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/?p=4982</guid>
		<description><![CDATA[引发异常很简单： throw “Hello error”; 捕获异常的语法也和java差不多： function test() { throw “Test error”; } try { test(); } catch (err) { console.log(err); }finally{ console.log(&#8216;finally&#8217;); }]]></description>
			<content:encoded><![CDATA[<p>引发异常很简单：</p>
<blockquote><p>throw “Hello error”;</p></blockquote>
<p>捕获异常的语法也和java差不多：</p>
<blockquote><p>function test() {<br />
throw “Test error”;<br />
}</p>
<p>try {<br />
test();<br />
} catch (err) {<br />
console.log(err);<br />
}finally{<br />
console.log(&#8216;finally&#8217;);<br />
}</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/4982/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nodejs继承的示例</title>
		<link>http://marshal.easymorse.com/archives/4980?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nodejs%25e7%25bb%25a7%25e6%2589%25bf%25e7%259a%2584%25e7%25a4%25ba%25e4%25be%258b</link>
		<comments>http://marshal.easymorse.com/archives/4980#comments</comments>
		<pubDate>Wed, 16 May 2012 04:03:26 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/?p=4980</guid>
		<description><![CDATA[nodejs，服务器端的javascript，也需要通过继承来实现代码的复用。 下面写的语法，未依赖nodejs函数，应该是标准的javascript语法。 var Hello = function (name) { this.name = name; Hello.prototype.sayHello = function () { console.log(&#8216;hello, &#8216; + this.name); }; }; var hello = new Hello(&#8216;zhangsan&#8217;); hello.sayHello(); var HelloImpl = function (name, title) { this.title = title; Hello.call(this, name); HelloImpl.prototype.sayHello=function(){ console.log(&#8216;Title: &#8216;+this.title); Hello.prototype.sayHello.call(this); }; }; HelloImpl.prototype = new Hello(); var helloImpl = new HelloImpl(&#8216;zhangsan&#8217;, [...]]]></description>
			<content:encoded><![CDATA[<p>nodejs，服务器端的javascript，也需要通过继承来实现代码的复用。</p>
<p>下面写的语法，未依赖nodejs函数，应该是标准的javascript语法。</p>
<blockquote><p>var Hello = function (name) {<br />
this.name = name;<br />
Hello.prototype.sayHello = function () {<br />
console.log(&#8216;hello, &#8216; + this.name);<br />
};<br />
};</p>
<p>var hello = new Hello(&#8216;zhangsan&#8217;);<br />
hello.sayHello();</p>
<p>var HelloImpl = function (name, title) {<br />
this.title = title;<br />
Hello.call(this, name);</p>
<p>HelloImpl.prototype.sayHello=function(){<br />
console.log(&#8216;Title: &#8216;+this.title);<br />
Hello.prototype.sayHello.call(this);<br />
};<br />
};</p>
<p>HelloImpl.prototype = new Hello();</p>
<p>var helloImpl = new HelloImpl(&#8216;zhangsan&#8217;, &#8216;Mr.&#8217;);<br />
helloImpl.sayHello();</p></blockquote>
<p><span id="more-4980"></span>执行的结果：</p>
<blockquote><p>hello, zhangsan<br />
Title: Mr.<br />
hello, zhangsan</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/4980/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>设置socket.io的日志级别</title>
		<link>http://marshal.easymorse.com/archives/4978?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e8%25ae%25be%25e7%25bd%25aesocket-io%25e7%259a%2584%25e6%2597%25a5%25e5%25bf%2597%25e7%25ba%25a7%25e5%2588%25ab</link>
		<comments>http://marshal.easymorse.com/archives/4978#comments</comments>
		<pubDate>Tue, 15 May 2012 10:06:03 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[socket.io]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/?p=4978</guid>
		<description><![CDATA[默认情况下，socket.io会打印大量的日志，比如这样： debug: client authorized info: handshake authorized 949572516804683503 debug: setting request GET /socket.io/1/websocket/949572516804683503 debug: set heartbeat interval for client 949572516804683503 debug: client authorized for debug: websocket writing 1:: 可以通过设置日志级别，屏蔽掉这些debug或者info的日志。 比如这样： var express = require(&#8216;express&#8217;) , routes = require(&#8216;./routes&#8217;) , io = require(&#8216;socket.io&#8217;); var app = module.exports = express.createServer(), io = io.listen(app); // Configuration io.set(&#8216;log level&#8217;, [...]]]></description>
			<content:encoded><![CDATA[<p>默认情况下，socket.io会打印大量的日志，比如这样：</p>
<blockquote><p>debug: client authorized<br />
info: handshake authorized 949572516804683503<br />
debug: setting request GET /socket.io/1/websocket/949572516804683503<br />
debug: set heartbeat interval for client 949572516804683503<br />
debug: client authorized for<br />
debug: websocket writing 1::</p></blockquote>
<p>可以通过设置日志级别，屏蔽掉这些debug或者info的日志。</p>
<p>比如这样：</p>
<blockquote><p>var express = require(&#8216;express&#8217;)<br />
, routes = require(&#8216;./routes&#8217;)<br />
, io = require(&#8216;socket.io&#8217;);</p>
<p>var app = module.exports = express.createServer(),<br />
io = io.listen(app);</p>
<p>// Configuration</p>
<p>io.set(&#8216;log level&#8217;, 0);</p></blockquote>
<p>详细socket.io配置参见：https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO</p>
<p>另外，日志级别的设置见：https://github.com/LearnBoost/Socket.IO/blob/master/lib/logger.js</p>
<p>设置的log level的数字，其实就是日志数组下标。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/4978/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MongoDB命令使用示例</title>
		<link>http://marshal.easymorse.com/archives/4973?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mongodb%25e5%2591%25bd%25e4%25bb%25a4%25e4%25bd%25bf%25e7%2594%25a8%25e7%25a4%25ba%25e4%25be%258b</link>
		<comments>http://marshal.easymorse.com/archives/4973#comments</comments>
		<pubDate>Wed, 18 Apr 2012 17:22:16 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[mongodb]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/?p=4973</guid>
		<description><![CDATA[用图书的示例来说明一下mongodb命令的使用。 添加 插入一个图书文档： db.books.insert({name:&#8217;深入学习MongoDB&#8217;}); 然后，可以看一下是否插入成功了： db.books.find(); 打印的结果类似这样： { “_id” : ObjectId(“4f8e8a8e7a919fd8a1a37e2d”), “name” : “深入学习MongoDB” } 好了，现在不想要这条记录了，删除掉： db.books.remove(); 再次使用find()，就不会打印内容了。这里要注意，remove()将删除集合中所有文档。如何删除指定条件的文档，后面再说。 修改 再次创建一个图书文档： db.books.insert({name:&#8217;钱的历史&#8217;,items:[]}); 这里我增加了一个空数组，后面有用。 现在我要将图书名称（name）改为：深入学习MongoDB。 命令： db.books.update({_id:ObjectId(“4f8e8a8e7a919fd8a1a37e2d”)},{name:&#8217;深入学习MongoDB&#8217;},false); 上述命令的缺点是，items属性没有了。如果只想修改图书的名称，而不影响文档的其他属性，可以这样： db.books.update({_id:ObjectId(“4f8ea9a619bc948142e0dad5&#8243;)},{$set:{name:&#8217;Deep in MongoDB&#8217;}},false); 现在，我想往空数组里添加一些东西，比如，一个条目： {_id:ObjectId, type:&#8217;chapter&#8217;,items:[]} 那么，命令如下：  db.books.update({_id:ObjectId(&#8217;4f8ea9a619bc948142e0dad5&#8242;)},{$push:{items:{_id:new ObjectId(),type:&#8217;chapter&#8217;,items:[]}}},false); 看一下显示的结果： { “_id” : ObjectId(“4f8ea9a619bc948142e0dad5&#8243;), “items” : [ { "_id" : ObjectId("4f8eaf227a919fd8a1a37e2e"), "type" : "chapter", "items" : [ ] } [...]]]></description>
			<content:encoded><![CDATA[<p>用图书的示例来说明一下mongodb命令的使用。</p>
<h3>添加</h3>
<p>插入一个图书文档：</p>
<blockquote><p>db.books.insert({name:&#8217;深入学习MongoDB&#8217;});</p></blockquote>
<p>然后，可以看一下是否插入成功了：</p>
<blockquote><p>db.books.find();</p></blockquote>
<p>打印的结果类似这样：</p>
<blockquote><p>{ “_id” : ObjectId(“4f8e8a8e7a919fd8a1a37e2d”), “name” : “深入学习MongoDB” }</p></blockquote>
<p><span id="more-4973"></span>好了，现在不想要这条记录了，删除掉：</p>
<blockquote><p>db.books.remove();</p></blockquote>
<p>再次使用find()，就不会打印内容了。这里要注意，remove()将删除集合中所有文档。如何删除指定条件的文档，后面再说。</p>
<h3>修改</h3>
<p>再次创建一个图书文档：</p>
<blockquote><p>db.books.insert({name:&#8217;钱的历史&#8217;,items:[]});</p></blockquote>
<p>这里我增加了一个空数组，后面有用。</p>
<p>现在我要将图书名称（name）改为：深入学习MongoDB。</p>
<p>命令：</p>
<blockquote><p>db.books.update({_id:ObjectId(“4f8e8a8e7a919fd8a1a37e2d”)},{name:&#8217;深入学习MongoDB&#8217;},false);</p></blockquote>
<p>上述命令的缺点是，items属性没有了。如果只想修改图书的名称，而不影响文档的其他属性，可以这样：</p>
<blockquote><p>db.books.update({_id:ObjectId(“4f8ea9a619bc948142e0dad5&#8243;)},{$set:{name:&#8217;Deep in MongoDB&#8217;}},false);</p></blockquote>
<p>现在，我想往空数组里添加一些东西，比如，一个条目：</p>
<blockquote><p>{_id:ObjectId, type:&#8217;chapter&#8217;,items:[]}</p></blockquote>
<p>那么，命令如下：</p>
<blockquote><p> db.books.update({_id:ObjectId(&#8217;4f8ea9a619bc948142e0dad5&#8242;)},{$push:{items:{_id:new ObjectId(),type:&#8217;chapter&#8217;,items:[]}}},false);</p></blockquote>
<p>看一下显示的结果：</p>
<blockquote><p>{<br />
“_id” : ObjectId(“4f8ea9a619bc948142e0dad5&#8243;),<br />
“items” : [<br />
{<br />
"_id" : ObjectId("4f8eaf227a919fd8a1a37e2e"),<br />
"type" : "chapter",<br />
"items" : [ ]<br />
}<br />
],<br />
“name” : “野外维生食物”<br />
}</p></blockquote>
<p>现在我们想在4f8eaf227a919fd8a1a37e2e的条目的数组中加入内容，怎么做呢？要用到push，它可以向指定的数组追加元素：</p>
<blockquote><p>db.books.update({_id:ObjectId(&#8217;4f8ea9a619bc948142e0dad5&#8242;)},{$push:{items:{_id:new ObjectId(),type:&#8217;chapter&#8217;,items:[]}}},false);</p></blockquote>
<p>现在我又发现追加的元素的type值错了，想改成section：</p>
<blockquote><p>db.books.update({_id:ObjectId(“4f8ea9a619bc948142e0dad5&#8243;),&#8217;items._id&#8217;:ObjectId(“4f8ef10b7a919fd8a1a37e32&#8243;)},{$set:{&#8216;items.$.type&#8217;:'section&#8217;}},false);</p></blockquote>
<p>我是否能在items的元素的items数组中再追加元素呢？答案是肯定的：</p>
<blockquote><p>db.books.update({_id:ObjectId(“4f8ea9a619bc948142e0dad5&#8243;),&#8217;items._id&#8217;:ObjectId(“4f8ef10b7a919fd8a1a37e32&#8243;)},{$push:{&#8216;items.$.items&#8217;:{_id:new ObjectId(),type:&#8217;section&#8217;,items:[]}}},false);</p></blockquote>
<p>追加后的结果类似这样：</p>
<blockquote><p>{<br />
“_id” : ObjectId(“4f8ea9a619bc948142e0dad5&#8243;),<br />
“items” : [<br />
{<br />
"_id" : ObjectId("4f8ef10b7a919fd8a1a37e32"),<br />
"items" : [<br />
{<br />
"_id" : ObjectId("4f8ef4d17a919fd8a1a37e33"),<br />
"type" : "section",<br />
"items" : [ ]<br />
}<br />
],<br />
“type” : “chapter”<br />
}<br />
]<br />
}</p></blockquote>
<p>&nbsp;</p>
<h3>删除</h3>
<p>如果文档添加了不该有的属性，想删除，比如：</p>
<blockquote><p>db.books.update({_id:ObjectId(&#8217;4f8e8a8e7a919fd8a1a37e2d&#8217;)},{$push:{hello:&#8217;test1&#8242;}},false);</p></blockquote>
<p>为文档增加了一个没用的属性，he l lo，这是个数组。</p>
<p>删除它：</p>
<blockquote><p>db.books.update({_id:ObjectId(&#8217;4f8e8a8e7a919fd8a1a37e2d&#8217;)},{$unset:{hello:1}},false);</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/4973/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>forever: 让nodejs应用后台执行</title>
		<link>http://marshal.easymorse.com/archives/4970?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=forever-%25e8%25ae%25a9nodejs%25e5%25ba%2594%25e7%2594%25a8%25e5%2590%258e%25e5%258f%25b0%25e6%2589%25a7%25e8%25a1%258c</link>
		<comments>http://marshal.easymorse.com/archives/4970#comments</comments>
		<pubDate>Tue, 10 Apr 2012 11:17:09 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[forever]]></category>
		<category><![CDATA[javascri]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/?p=4970</guid>
		<description><![CDATA[让nodejs应用后台执行，最简单的办法是： nohup node your_app.js &#38; 但是，forever能做更多的事情，比如分别记录输出和错误日志，比如可以在js中作为api使用。 我们只是很简单的在命令行里使用它。 安装很简单： sudo npm install forever -g 使用forever启动守护进程： forever start server.js 关闭守护进程： forever stop server.js 如果需要记录输出日志和错误： forever start -l forever.log -o out.log -e err.log server.js &#160;]]></description>
			<content:encoded><![CDATA[<p>让nodejs应用后台执行，最简单的办法是：</p>
<blockquote><p>nohup node your_app.js &amp;</p></blockquote>
<p>但是，forever能做更多的事情，比如分别记录输出和错误日志，比如可以在js中作为api使用。</p>
<p>我们只是很简单的在命令行里使用它。</p>
<p>安装很简单：</p>
<blockquote>
<pre><span style="font-family: monospace;">sudo npm install forever -g</span></pre>
</blockquote>
<pre><span style="font-family: monospace;">使用forever启动守护进程：</span></pre>
<blockquote>
<pre><span style="font-family: monospace;">forever start server.js
</span></pre>
</blockquote>
<pre><span style="font-family: monospace;">关闭守护进程：</span></pre>
<blockquote>
<pre><span style="font-family: monospace;">forever stop server.js
</span></pre>
</blockquote>
<pre><span style="font-family: monospace;">如果需要记录输出日志和错误：</span></pre>
<blockquote>
<pre></pre>
<pre><code>forever start -l forever.log -o out.log -e err.log server.js</code></pre>
<pre><span style="font-family: monospace;">
</span></pre>
</blockquote>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/4970/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>nodejs下复用代码的方案</title>
		<link>http://marshal.easymorse.com/archives/4967?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nodejs%25e4%25b8%258b%25e5%25a4%258d%25e7%2594%25a8%25e4%25bb%25a3%25e7%25a0%2581%25e7%259a%2584%25e6%2596%25b9%25e6%25a1%2588</link>
		<comments>http://marshal.easymorse.com/archives/4967#comments</comments>
		<pubDate>Fri, 06 Apr 2012 10:17:44 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/?p=4967</guid>
		<description><![CDATA[现在项目中使用nodejs，代码是堆出来了，但是复用性很差，以后维护成问题。 通过以下方式，做了个复用的方案。 常量 如果一遍一遍的写下面这样的代码： var bookProvider = new BookProvider(“localhost”, 27017); 这部分代码，应该用常量来解决，nodejs提供了Globals模块，里面的global可以设置常量： global.mongodbHost=&#8217;localhost&#8217;; global.mongodbPort=27017; 使用： console.log(&#8216;mongodb host:&#8217;+global.mongodbHost);  继承 继承可以让子类复用父类的方法。在nodejs中，提供了继承机制的支持，需要引入： var util=require(&#8216;util&#8217;); 比如，我有一个Provider类： var Provider=function(){ }; Provider.prototype.delete=function(id,callback){ console.log(&#8216;delete document from Provider&#8217;); }; exports.Provider=Provider; 现在，我有一个PersonProvider子类： var Provider=require(&#8216;./Provider&#8217;).Provider, util=require(&#8216;util&#8217;); var PersonProvider=function(){ console.log(&#8216;mongodb host:&#8217;+global.mongodbHost); }; util.inherits(PersonProvider,Provider); 覆盖 子类可以覆盖超类的方法： var Provider=require(&#8216;./Provider&#8217;).Provider, util=require(&#8216;util&#8217;); var PersonProvider=function(){ console.log(&#8216;mongodb host:&#8217;+global.mongodbHost); }; util.inherits(PersonProvider,Provider); Provider.prototype.delete=function(id,callback){ console.log(&#8216;delete document from [...]]]></description>
			<content:encoded><![CDATA[<p>现在项目中使用nodejs，代码是堆出来了，但是复用性很差，以后维护成问题。</p>
<p>通过以下方式，做了个复用的方案。</p>
<p><strong>常量</strong></p>
<p>如果一遍一遍的写下面这样的代码：</p>
<blockquote><p>var bookProvider = new BookProvider(“localhost”, 27017);</p></blockquote>
<p>这部分代码，应该用常量来解决，nodejs提供了Globals模块，里面的global可以设置常量：</p>
<blockquote><p>global.mongodbHost=&#8217;localhost&#8217;;<br />
global.mongodbPort=27017;</p></blockquote>
<p>使用：</p>
<blockquote><p>console.log(&#8216;mongodb host:&#8217;+global.mongodbHost);</p></blockquote>
<p><span id="more-4967"></span></p>
<p><strong> 继承</strong></p>
<p>继承可以让子类复用父类的方法。在nodejs中，提供了继承机制的支持，需要引入：</p>
<blockquote><p>var util=require(&#8216;util&#8217;);</p></blockquote>
<p>比如，我有一个Provider类：</p>
<blockquote><p>var Provider=function(){</p>
<p>};</p>
<p>Provider.prototype.delete=function(id,callback){<br />
console.log(&#8216;delete document from Provider&#8217;);<br />
};</p>
<p>exports.Provider=Provider;</p></blockquote>
<p>现在，我有一个PersonProvider子类：</p>
<blockquote><p>var Provider=require(&#8216;./Provider&#8217;).Provider,<br />
util=require(&#8216;util&#8217;);</p>
<p>var PersonProvider=function(){<br />
console.log(&#8216;mongodb host:&#8217;+global.mongodbHost);<br />
};</p>
<p>util.inherits(PersonProvider,Provider);</p></blockquote>
<p><strong>覆盖</strong></p>
<p>子类可以覆盖超类的方法：</p>
<blockquote><p>var Provider=require(&#8216;./Provider&#8217;).Provider,<br />
util=require(&#8216;util&#8217;);</p>
<p>var PersonProvider=function(){<br />
console.log(&#8216;mongodb host:&#8217;+global.mongodbHost);<br />
};</p>
<p>util.inherits(PersonProvider,Provider);</p>
<p>Provider.prototype.delete=function(id,callback){<br />
console.log(&#8216;delete document from PersonProvider&#8217;);<br />
};</p></blockquote>
<p>完整的源代码见：<a href="https://github.com/MarshalW/Demos/tree/v0.2">https://github.com/MarshalW/Demos/tree/v0.2</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/4967/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

