<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>CNode：Node.js专业中文社区</title><link>http://cnodejs.org</link><language>zh-cn</language><description>CNode：Node.js专业中文社区</description><item><title>[dailyNode] 10 Tips to Make Your Node.js Web App Faster</title><link>http://cnodejs.org/topic/540b0bb7999b5b5f4200d8a7</link><guid>http://cnodejs.org/topic/540b0bb7999b5b5f4200d8a7</guid><description>&lt;p&gt;10 Tips to Make Your Node.js Web App Faster&lt;br&gt;&lt;a href=&quot;http://www.sitepoint.com/10-tips-make-node-js-web-app-faster/&quot;&gt;地址&lt;/a&gt;&lt;/p&gt;
</description><author>yaochun</author><pubDate>Sat, 06 Sep 2014 13:27:19 GMT</pubDate></item><item><title>用fs模块遍历文件夹内的所有文件，并且把所有文件重命名，为什么文件会莫名其妙的越来越少？</title><link>http://cnodejs.org/topic/540acc422e53eba05a7cfa38</link><guid>http://cnodejs.org/topic/540acc422e53eba05a7cfa38</guid><description>&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;    /*同步操作，没有问题
    if (fs.statSync(dirPath).isDirectory()) {
         fs.readdirSync(dirPath).forEach(function(file,i){
         var oldName = path.join(dirPath,file);
         var newName = path.join(dirPath,&quot;xu&quot;+i+&quot;.jpg&quot;);
         fs.renameSync(oldName,newName);
         });
         alert(&quot;ok&quot;);
    }
    */
    //等价的异步操作,一个个遍历执行重命名，每执行一次，都有部分文件被删除
    fs.stat(dirPath,function (err,status) {
        if(status.isDirectory()){
            fs.readdir(dirPath,function(err,files){
                (function next(i){
                    if(i&amp;lt;files.length){
                        console.log(files.length);
                        console.log(i);
                        var oldName = path.join(dirPath,files[i]);
                        var newName = path.join(dirPath,&quot;xu&quot;+i+&quot;.jpg&quot;);
                        fs.rename(oldName,newName,function(err){
                            if(err){
                                console.log(err);
                            }else{
                                next(++i);
                            }
                        });
                    }else{
                        alert(&quot;ok&quot;);
                    }

                }(0));

            });
        }
    })&lt;/code&gt;&lt;/pre&gt;</description><author>nanjixiong218</author><pubDate>Sat, 06 Sep 2014 08:56:34 GMT</pubDate></item><item><title>按照koa官方给的例子做文件上传失败，用koa做过文件上传的同学能传授下经验吗？</title><link>http://cnodejs.org/topic/540ab470f4d8f79a5a754f37</link><guid>http://cnodejs.org/topic/540ab470f4d8f79a5a754f37</guid><description>&lt;p&gt;按照官方给的这个例子去做&lt;a href=&quot;https://github.com/koajs/examples/blob/master/upload/index.js&quot;&gt;https://github.com/koajs/examples/blob/master/upload/index.js&lt;/a&gt;&lt;br&gt;可是总是获取不到上传的内容，进入不到while里面：&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;app.use(function *(next){
  // ignore non-POSTs
  if (&apos;POST&apos; != this.method) return yield next;

  // multipart upload
  var parts = parse(this);
  var part;

  while (part = yield parts) {
    var stream = fs.createWriteStream(&apos;/tmp/&apos; + Math.random());
    part.pipe(stream);
    console.log(&apos;uploading %s -&amp;gt; %s&apos;, part.filename, stream.path);
  }

  this.redirect(&apos;/&apos;);
});&lt;/code&gt;&lt;/pre&gt;</description><author>JerroldLee</author><pubDate>Sat, 06 Sep 2014 07:14:56 GMT</pubDate></item><item><title>为什么cnodejs里边用的不是自己的搜索功能而是用的谷歌呢</title><link>http://cnodejs.org/topic/540a8e9f2e53eba05a705860</link><guid>http://cnodejs.org/topic/540a8e9f2e53eba05a705860</guid><description>&lt;p&gt;虽然我知道大家都可以翻墙但是为什么cnode不自己弄个搜索呢。&lt;/p&gt;
</description><author>bipeng0405</author><pubDate>Sat, 06 Sep 2014 04:33:35 GMT</pubDate></item><item><title>发现整个项目里头大量的async waterfall，这样的风格是不是不太好？</title><link>http://cnodejs.org/topic/540a6ba92e53eba05a6998f1</link><guid>http://cnodejs.org/topic/540a6ba92e53eba05a6998f1</guid><description>&lt;p&gt;js的特色就是异步？如果通篇全是series和waterfall，风格是不是不太好？&lt;/p&gt;
&lt;p&gt;不过换句话说，虽然单个流程都是串行的，但是由于网站这样的系统会有并发访问，多用waterfall貌似也不会降低太多效率吧？？&lt;/p&gt;
</description><author>friskit-china</author><pubDate>Sat, 06 Sep 2014 02:04:25 GMT</pubDate></item><item><title>求助帖:怎么创建unix domain socket?</title><link>http://cnodejs.org/topic/540a5b922e53eba05a66752e</link><guid>http://cnodejs.org/topic/540a5b922e53eba05a66752e</guid><description>&lt;p&gt;我直接写&lt;br&gt;server.listen(&amp;#39;toPHP.sock&amp;#39;,function(){});&lt;br&gt;结果报错&lt;/p&gt;
&lt;p&gt;events.js:72&lt;br&gt;        throw er; // Unhandled &amp;#39;error&amp;#39; event&lt;br&gt;              ^&lt;br&gt;Error: listen EACCES&lt;br&gt;    at errnoException (net.js:904:11)&lt;br&gt;    at Server._listen2 (net.js:1023:19)&lt;br&gt;    at listen (net.js:1064:10)&lt;br&gt;    at Server.listen (net.js:1132:5)&lt;br&gt;    at Object.&lt;anonymous&gt; (D:\wwwroot\nodejs\test1\toPHP.js:20:3)&lt;br&gt;    at Module._compile (module.js:456:26)&lt;br&gt;    at Object.Module._extensions..js (module.js:474:10)&lt;br&gt;    at Module.load (module.js:356:32)&lt;br&gt;    at Function.Module._load (module.js:312:12)&lt;br&gt;    at Function.Module.runMain (module.js:497:10)&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;用的是xp的系统&lt;/code&gt;&lt;/pre&gt;</description><author>buxkk321</author><pubDate>Sat, 06 Sep 2014 00:55:46 GMT</pubDate></item><item><title>上传图片测试！不能删除仍然是个硬伤</title><link>http://cnodejs.org/topic/5409c6422e53eba05a49b0bc</link><guid>http://cnodejs.org/topic/5409c6422e53eba05a49b0bc</guid><description></description><author>nodejs2015</author><pubDate>Fri, 05 Sep 2014 14:18:42 GMT</pubDate></item><item><title>http://angularjs.org/ 也被封了？</title><link>http://cnodejs.org/topic/5409b69cf4d8f79a5a44b8e6</link><guid>http://cnodejs.org/topic/5409b69cf4d8f79a5a44b8e6</guid><description>&lt;p&gt;最近由于一个项目用到angularjs，想上官网下载点资料，结果发现用了翻墙都访问不了？是被封了，还是改站名了，请大家提供个方法，让我上去看看，&lt;br&gt;保证不反对郭嘉&lt;/p&gt;
</description><author>xinshouke</author><pubDate>Fri, 05 Sep 2014 13:11:56 GMT</pubDate></item><item><title>智能硬件创业公司寻找nodejs小伙伴加入</title><link>http://cnodejs.org/topic/5409a1522e53eba05a426d94</link><guid>http://cnodejs.org/topic/5409a1522e53eba05a426d94</guid><description>&lt;p&gt;hi，各位noder&lt;br&gt;我们是北京的一家智能硬件创业团队，公司靠谱，马上进入A轮；&lt;br&gt;我们团队80%成员来自BAT，团队具有顶尖的云服务，多媒体，软件，智能硬件研发经验，&lt;br&gt;产品已经发布，开始进入量产阶段。&lt;br&gt;我们需要熟悉nodejs的前端和后端小伙伴（最好前后端都能cover）的加入。&lt;br&gt;在这里你能找到技术上的共鸣（我们团队应该是国内最早接触node的团队之一），轻松活跃的氛围，远大目标的诱惑。&lt;br&gt;同时我们有业界竞争力的薪水，还有原始期权等着你。&lt;br&gt;有兴趣的noder请发邮件到hr@dding.net.&lt;/p&gt;
</description><author>zhangdongsheng12</author><pubDate>Fri, 05 Sep 2014 11:41:06 GMT</pubDate></item><item><title>Express 有个 router.use()，有木有方法实现类似 router.unuse()来撤销router.use ？</title><link>http://cnodejs.org/topic/540999dcf4d8f79a5a3f4857</link><guid>http://cnodejs.org/topic/540999dcf4d8f79a5a3f4857</guid><description>&lt;p&gt;在Express 4.x 中，通过router.use可以使用router级别的中间件，通过什么方式可以实现类似 router.unuse 的功能，来取消使用这个中间件。&lt;/p&gt;
&lt;p&gt;这个过程都是在系统运行时进行的，答案不能是删掉相关代码重启应用哟。&lt;/p&gt;
</description><author>sarike</author><pubDate>Fri, 05 Sep 2014 11:09:16 GMT</pubDate></item><item><title>谁能写出这样的JSON String</title><link>http://cnodejs.org/topic/540983ef2e53eba05a3c860b</link><guid>http://cnodejs.org/topic/540983ef2e53eba05a3c860b</guid><description>&lt;pre class=&quot;prettyprint language-javascript&quot;&gt;&lt;code&gt;var json = &quot;{ \&quot;name\&quot;: \&quot;&quot; + $(&quot;input#name&quot;).val()
          + &quot;\&quot;, \&quot;date\&quot;: \&quot;&quot; + $(&quot;input#date&quot;).val()
          + &quot;\&quot;, \&quot;title\&quot;: \&quot;&quot; + $(&quot;input#title&quot;).val()
          + &quot;\&quot;, \&quot;description\&quot;: \&quot;&quot; + $(&quot;textarea#description&quot;).val()
          + &quot;\&quot; }&quot;;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这样写的话， 我真的写不出。 转义什么的很混乱有木有？&lt;/p&gt;
&lt;p&gt;有没有其他简便方法？&lt;/p&gt;
</description><author>DrakeLeung</author><pubDate>Fri, 05 Sep 2014 09:35:43 GMT</pubDate></item><item><title>nodejs如何即时获取memcache的值？</title><link>http://cnodejs.org/topic/54097a60f4d8f79a5a38f9eb</link><guid>http://cnodejs.org/topic/54097a60f4d8f79a5a38f9eb</guid><description>&lt;p&gt;刚接触nodejs不久。 对nodejs不是很了解。&lt;/p&gt;
&lt;p&gt;怎么可以计时获取到memcache的值呢？   &lt;/p&gt;
&lt;p&gt;memcache.get(&amp;#39;mykey&amp;#39;,function(err,res){&lt;br&gt;        //代码难道要全部写在这里？&lt;br&gt;    });&lt;/p&gt;
&lt;p&gt;因为如果memcache没有值。就会去查数据库缓存。&lt;br&gt;但是全部在回调里面去写。而且回调全部是异步执行的。&lt;/p&gt;
&lt;p&gt;各位大大。请问你们这里怎么解决的呢？&lt;/p&gt;
</description><author>lixuewu</author><pubDate>Fri, 05 Sep 2014 08:54:56 GMT</pubDate></item><item><title>express include 是否可以传参数  2.0使用partial 这种方式不知道3.0 分部视图带参数如何实现</title><link>http://cnodejs.org/topic/54096a76f4d8f79a5a35acdc</link><guid>http://cnodejs.org/topic/54096a76f4d8f79a5a35acdc</guid><description>&lt;p&gt;express include 是否可以传参数  2.0使用partial 这种方式不知道3.0 分部视图带参数如何实现&lt;/p&gt;
</description><author>stuyun</author><pubDate>Fri, 05 Sep 2014 07:47:02 GMT</pubDate></item><item><title>howdo——如何做，一个简易的异步流程控制</title><link>http://cnodejs.org/topic/540964432e53eba05a35cfe5</link><guid>http://cnodejs.org/topic/540964432e53eba05a35cfe5</guid><description>&lt;h1 id=&quot;howdo-npm-version-https-img-shields-io-npm-v-howdo-svg-style-flat-https-npmjs-org-package-howdo-&quot;&gt;howdo&lt;a href=&quot;https://npmjs.org/package/howdo&quot;&gt;&lt;img src=&quot;https://img.shields.io/npm/v/howdo.svg?style=flat&quot; alt=&quot;NPM version&quot;&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;如何做，一个简易的异步流程控制&lt;/p&gt;
&lt;h1 id=&quot;features&quot;&gt;FEATURES&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;nodejs（all）、browser（IE6/7/8/9/10/11、chrome、firefox）通用&lt;/li&gt;
&lt;li&gt;注重约定&lt;/li&gt;
&lt;li&gt;同步、异步任务都支持&lt;/li&gt;
&lt;li&gt;支持顺序串行任务&lt;/li&gt;
&lt;li&gt;支持顺序并行任务&lt;/li&gt;
&lt;li&gt;自动实例化&lt;/li&gt;
&lt;li&gt;链式操作&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;install&quot;&gt;INSTALL&lt;/h1&gt;
&lt;h2 id=&quot;nodejs&quot;&gt;nodejs&lt;/h2&gt;
&lt;pre class=&quot;prettyprint language-cmd&quot;&gt;&lt;code&gt;npm i howdo -S&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;prettyprint language-js&quot;&gt;&lt;code&gt;var howdow = require(&apos;howdo&apos;);&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;browser&quot;&gt;browser&lt;/h2&gt;
&lt;h3 id=&quot;dir&quot;&gt;Dir&lt;/h3&gt;
&lt;pre class=&quot;prettyprint language-html&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;/path/to/howdo.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
// howdo挂载在window对象上
// do sth...
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;amd&quot;&gt;AMD&lt;/h3&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;defined([&apos;howdo&apos;], function(howdo){
    // do sth...
});&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;cjs&quot;&gt;CJS&lt;/h3&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;var howdo = require(&apos;howdo&apos;);
// do sth...&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;api&quot;&gt;API&lt;/h1&gt;
&lt;h2 id=&quot;-task-&quot;&gt;&lt;code&gt;#task&lt;/code&gt; 分配单个任务，链式&lt;/h2&gt;
&lt;pre class=&quot;prettyprint language-js&quot;&gt;&lt;code&gt;// 分配顺序串行任务
howdo
    // 分配单次任务 1
    .task(function (next) {
        // 第一个参数必须是Error对象的实例，如果没有错误，传null
        // 可以传多个结果给下一个任务接收
        next(null, 1, 2, 3);
    })
    // 分配单次任务 2
    .task(function (next, data1, data2, data3) {
        // data1 = 1
        // data2 = 2
        // data3 = 3
        next(null, data1 + data2 + data3);
    })
    .follow(function (err, data) {
        // err = null
        // data = 6
    });


// 分配顺序并行任务
howdo
    // 分配单次任务 1
    .task(function (done) {
        // 第一个参数必须是Error对象的实例，如果没有错误，传null
        // 可以传多个结果给结果接收
        done(null, 1, 2, 3);
    })
    // 分配单次任务 2
    .task(function (done) {
        done(null, 4);
    })
    .follow(function (err, data1, data2, data3, data4) {
        // err = null
        // data1 = 1
        // data2 = 2
        // data3 = 3
        // data4 = 4
    });&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;-each-&quot;&gt;&lt;code&gt;#each&lt;/code&gt; 循环分配任务，链式&lt;/h2&gt;
&lt;pre class=&quot;prettyprint language-js&quot;&gt;&lt;code&gt;// task是用来分配单个次序任务，而如果是批量次序任务的话，就需要用each来操作了

var list = [1, 2, 3, 4];

// 批量分配顺序串行任务
howdo
    .each(list, function (key, val, next, data) {
        // 第1次： data = undefined
        // 第2次： data = 1
        // 第3次： data = 2
        // 第4次： data = 3
        next(null, val);
    })
    .follow(function (err, data) {
        // err = null
        // data = 4
    });


// 批量分配顺序并行任务
howdo
    .each(list, function (key, val, done) {
        done(null, val);
    })
    .together(function (err, data1, data2, data3, data4) {
        // err = null
        // data1 = 1
        // data2 = 2
        // data3 = 3
        // data4 = 4
    });&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;-follow-&quot;&gt;&lt;code&gt;#follow&lt;/code&gt; 顺序串行任务，链式结束&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;follow&lt;/code&gt;用来收集任务结果，如其字面意思，表示多个任务是顺序串行执行的。&lt;/p&gt;
&lt;h2 id=&quot;-together-&quot;&gt;&lt;code&gt;#together&lt;/code&gt; 顺序并行任务，链式结束&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;together&lt;/code&gt;也是用来收集任务结果，如其字面意思，表示多个任务是顺序并行执行的。&lt;/p&gt;
&lt;h1 id=&quot;howdo-vs-ajax&quot;&gt;Howdo VS AJAX&lt;/h1&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;// 此处以jquery为例
// 首先来改装下 $.ajax
function request(options, callback) {
    $.ajax(options).done(function (json) {
        if (json.error) {
            return callback(new Error(json.error));
        }

        callback(null, json.data);
    }).fail(function (jqXHR) {
        callback(new Error(jqXHR.responseText));
    });
}


howdo.task(function (next) {
    request({
        url: &apos;1&apos;
    }, next);
}).task(function (next) {
    request({
        url: &apos;2&apos;
    }, next);
}).follow(function (err, data) {
    // do sth...
});


howdo.task(function (done) {
    request({
        url: &apos;1&apos;
    }, done);
}).task(function (done) {
    request({
        url: &apos;2&apos;
    }, done);
}).follow(function (err, data1, data2) {
    // do sth...
});&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;more&quot;&gt;MORE&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://qianduanblog.com/post/nodejs-learning-17-howdo-a-simple-workflow-solutions.html&quot;&gt;《nodejs学习17：howdo如何做，一个简易的异步流程控制》&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://qianduanblog.com/post/nodejs-learning-18-howdo-how-to-do-a-simple-flow-control-v1-0-0-release.html&quot;&gt;《nodejs学习18：howdo——如何做，一个简易的流程控制，v1.0.0版本发布》&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;version&quot;&gt;VERSION&lt;/h1&gt;
&lt;h2 id=&quot;v-1-1-1&quot;&gt;v 1.1.1&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;修复空列表的each问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;v-1-1-0&quot;&gt;v 1.1.0&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;兼容到IE6、chrome、firefox&lt;/li&gt;
&lt;li&gt;兼容到nodejs&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;v-0-0-1&quot;&gt;v 0.0.1&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;初始版本&lt;/li&gt;
&lt;/ul&gt;
</description><author>cloudcome</author><pubDate>Fri, 05 Sep 2014 07:20:35 GMT</pubDate></item><item><title>刚学nodejs 有个问题，求大神帮忙回答下</title><link>http://cnodejs.org/topic/5409610cf4d8f79a5a33c3c9</link><guid>http://cnodejs.org/topic/5409610cf4d8f79a5a33c3c9</guid><description>&lt;p&gt;买了一本nodejs 权威指南，看到fs这一章，发现一句话不明白，请问什么叫排他方式打开文件&lt;/p&gt;
</description><author>hoozi</author><pubDate>Fri, 05 Sep 2014 07:06:52 GMT</pubDate></item><item><title>求助帖：express新建项目成功，但无法运行app.js</title><link>http://cnodejs.org/topic/54095d792e53eba05a344441</link><guid>http://cnodejs.org/topic/54095d792e53eba05a344441</guid><description>&lt;p&gt;我是参考《node.js开发指南》里面自学的，现在在第五章这里，我照着实例express -e ejs microblog创建了一个项目,并且经过折腾后也能正常npm install但是执行项目的app.js时候直接就不行了，也不报错，就是又回去了。&lt;br&gt;具体可以参考我在这里的提问，问题描述的最后那一段，不知道各位大神碰到过没有，菜鸟小弟谢过了&lt;br&gt; &lt;a href=&quot;http://segmentfault.com/q/1010000000659682&quot;&gt;问题描述&lt;/a&gt;&lt;/p&gt;
</description><author>shenger153</author><pubDate>Fri, 05 Sep 2014 06:51:37 GMT</pubDate></item><item><title>【daiily Node】React Components</title><link>http://cnodejs.org/topic/54095d622e53eba05a343eb3</link><guid>http://cnodejs.org/topic/54095d622e53eba05a343eb3</guid><description>&lt;p&gt;类似npm这种查询package的网站类似，但是内容针对react&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;   In the Node community, frontend package managers are regarded with suspicion. I’ve worked on projects that manage client-side dependencies with both Bower and npm, and although Bower does an admirable job I often feel like I should be using npm instead. That’s mainly because I always have to add a step where client-side files are preprocessed and moved from where Bower downloads them, so it’s not really much different to accessing the same files in node_modules.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;http://react-components.com/&quot;&gt;react-components&lt;/a&gt;&lt;/p&gt;
</description><author>yaochun</author><pubDate>Fri, 05 Sep 2014 06:51:14 GMT</pubDate></item><item><title>新人求一个nodejs 能够加密的模块(已解决)</title><link>http://cnodejs.org/topic/54094cf7f4d8f79a5a2f1bca</link><guid>http://cnodejs.org/topic/54094cf7f4d8f79a5a2f1bca</guid><description>&lt;p&gt;想求一个能加密下 密码 之类的模块。MD5  啥啥啥的都可以，请各位前辈给个名称或者直接发链接&lt;/p&gt;
</description><author>hc2014</author><pubDate>Fri, 05 Sep 2014 05:41:11 GMT</pubDate></item><item><title>【坐标：广州】【英国伦交所上市公司-环球市场集团】招聘web前端工程师</title><link>http://cnodejs.org/topic/54092f13f4d8f79a5a292de2</link><guid>http://cnodejs.org/topic/54092f13f4d8f79a5a292de2</guid><description>&lt;h1 id=&quot;web-&quot;&gt;Web前端高级工程师&lt;/h1&gt;
&lt;h3 id=&quot;-&quot;&gt;关于我们&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;我们是一家人不多，事很多的上市电商集团。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;每天全球范围内有上亿的人通过我们的平台做买卖。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;从中国首家B2B公司到目前GooglePR值达到7，我们还是坚持小而美的团队。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;因为我们晓得每一个攻城师都有一个超级大脑和强大心脏。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;（国际贸易业务： [www.globalmarket.com] M2C直销平台：飞飞商城  [www.feifei.com]  ）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;﻿&lt;/p&gt;
&lt;h3 id=&quot;-&quot;&gt;目前获得的一些成就&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;CCTV年度雇主；《财富》杂志评选的卓越雇主-中国最适宜工作公司。﻿﻿&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Jafco等世界顶尖VC投资3000万美元；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;中国商务部颁发“贸易促进贡献奖”、商务部电子商务示范企业；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;成功收购香港B2B上市公司TradeEasy.comx；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;中国贸促会评选的中国高端电子商务第一品牌；&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;-&quot;&gt;基本技能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HTML5, CSS3, JavaScript&lt;/li&gt;
&lt;li&gt;jQuery&lt;/li&gt;
&lt;li&gt;Ajax &amp;amp; JSONP&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;-&quot;&gt;加分项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;了解模块化 / 工程化开发，如 RequireJS / Sea.js&lt;/li&gt;
&lt;li&gt;了解 MVC，AngularJS / Knockout / Backbone / Ember.js&lt;/li&gt;
&lt;li&gt;了解常见 JavaScript 设计模式&lt;/li&gt;
&lt;li&gt;了解响应式布局&lt;/li&gt;
&lt;li&gt;了解 iOS、Andriod 等常见移动设备浏览器的特性，有开发经验更佳&lt;/li&gt;
&lt;li&gt;熟练使用 Git 等版本控制系统&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-&quot;&gt;同时，我们也希望你是：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;不羁，自认为是guru，可以主导一切&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;轻松拿下BAT offer，但是就是不喜欢人挤人的地方&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;不把理想挂在嘴边，但是一步一步，走在路上&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-&quot;&gt;我们提供：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;互联网中极具竞争力薪资档位(15K-25K)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;无限爆发的期权激励&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;独当一面的项目机会和高速发展平台&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;谷歌总裁都赞不绝口的办公环境&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-&quot;&gt;全球总裁级别的健康福利&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;*广西巴马特供水，极其低价可饮用世界长寿之乡巴马直供GMC联盟的巴马丽琅泉水。&lt;/li&gt;
&lt;li&gt;*属于自己的后花园，享受来自世界长寿之乡巴马直供的健康农作物。&lt;/li&gt;
&lt;li&gt;*私家饭堂、餐厅，享受自家农庄种植的有机、无公害蔬菜及养殖的鸡、鸭、猪等。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-m2czhaopin-corp-globalmarket-com&quot;&gt;投递地址：m2czhaopin@corp.globalmarket.com&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;旅行者1号，1977年发射。经历了36年，终于冲出了太阳系，进入外太空的星际空间。他这样孤独地漂流，只为去未知的世界看一眼。&lt;/li&gt;
&lt;li&gt;如果你心存理想，那么请不犹豫，加入我们一起创造未知的世界！&lt;br&gt;&lt;img src=&quot;http://cnode.qiniudn.com/FpBcZsbP30_lQI_sbfluHWiB6VRH&quot; alt=&quot;IMG_6882.JPG&quot;&gt; &lt;img src=&quot;http://cnode.qiniudn.com/FijaPGSbHh4ZLq0m3Bso_BUwuX4U&quot; alt=&quot;IMG_6898.JPG&quot;&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><author>president5</author><pubDate>Fri, 05 Sep 2014 03:33:39 GMT</pubDate></item><item><title>编写事件驱动模型</title><link>http://cnodejs.org/topic/54091022f4d8f79a5a229fca</link><guid>http://cnodejs.org/topic/54091022f4d8f79a5a229fca</guid><description>&lt;p&gt;Nodejs本身是基于事件驱动的，这个都知道。如果你看过Nodejs events模块，应该很了解Nodejs是如何驱动异步回调的。&lt;/p&gt;
&lt;p&gt;现在有许多人对异步和异步后台多并发产生了迷惑，或借助koa，或借助async，但是代码一出来，结果是什么呢？ 我认为是维护灾难！这样的代码被扔到大量的语法糖构造起来的数组中，所有使用这个代码的人必须同意和遵守潜在的约定，才能知道这个代码是怎么串行或者并行的。&lt;/p&gt;
&lt;p&gt;我想，这绝对不是Nodejs作者对异步设计的初衷。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;事件的优势是“分发”，在任何一个事件都对自己的代码有绝对的控制权。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nodejs源代码本身就提供了很好的异步事件驱动模型编码的范例。&lt;/p&gt;
&lt;p&gt;下面，我们谈谈，最典型的例子：&lt;br&gt;&lt;strong&gt;&lt;em&gt;并发|串行向数据库异步提取数据，然后把返回的所有数据聚合，并且作出响应。&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&quot;-&quot;&gt;为了模拟这个数据库操作，现在构建这么两个函数:&lt;/h3&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;
var dbFindA = function (name, callback) {
// 数据库查询模拟函数，输入name，1秒后返回结果
    setTimeout(function () {
        callback(name.length * 1000);
    }, 1000);
};
var dbFindB = function (id, callback) {
// 数据库查询模拟函数，输入id，2秒后返回结果
    setTimeout(function () {
        callback(parseInt(id) + 1000);
    }, 2000);
};&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;dbFindA耗时1秒，dbFindB耗时2秒。&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&quot;-eventemitter-&quot;&gt;然后，使用内置的EventEmitter来达到事件驱动的效果。&lt;/h3&gt;
&lt;p&gt;代码如下:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;
var events = require(&apos;events&apos;);

function Model (name, id) {
// 基于事件驱动的并发查询模型
    var self = this;
    var count = 2;

    function roll () {
    // 检测查询完成处理器数
        if (--count === 0) {
            self.emit(&apos;end&apos;);
        }
    }

    dbFindA(name, function (result) {
        self.emit(&apos;name&apos;, result);
        roll();
    });
    dbFindB(id, function (result) {
        self.emit(&apos;id&apos;, result);
        roll();
    });
}
Model.prototype = Object.create(events.EventEmitter.prototype);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这就是写出来的基于事件驱动的数据并发读取模型，按照设计，会有3个事件:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;name&amp;quot; dbFindA查询完的时候触发&lt;/li&gt;
&lt;li&gt;&amp;quot;id&amp;quot; dbFindB查询完的时候触发&lt;/li&gt;
&lt;li&gt;&amp;quot;end&amp;quot; 所有的查询完的时候触发&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-&quot;&gt;那么，来测试一下这个模型是不是我们想要的:&lt;/h3&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;
var assert = require(&apos;assert&apos;);
var results = {};
var m = new Model(&apos;lili&apos;, 10);
m
.on(&apos;name&apos;, function (result) { 
    results[&apos;name&apos;] = result;
    assert.ok(typeof result === &apos;number&apos;);
    assert.strictEqual(result, 4000);
})
.on(&apos;id&apos;, function (result) {
    results[&apos;id&apos;] = result;
    assert.ok(typeof result === &apos;number&apos;);
    assert.strictEqual(result, 1010);
})
.on(&apos;end&apos;, function () {
    console.log(&apos;-- results: &apos;, results);
    assert.deepEqual(results, {
        name: 4000,
        id: 1010
    });
});&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这里会得到想到的结果。&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&quot;-&quot;&gt;那么实际的模型会是这样的&lt;/h3&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;
var events = require(&apos;events&apos;);

function Model (db, userColl, articleColl, userSelector, articleSelector) {
// 基于事件驱动的并发查询模型
    var self = this;
    var count = 2;

    function roll () {
    // 检测查询完成处理器数
        if (--count === 0) {
            self.emit(&apos;end&apos;);
        }
    }

    db.collection(userColl).findOne(userSelector, function (err, result) {
        self.emit(&apos;user&apos;, err, result);
        roll();
    });
    db.collection(articleColl).findOne(articleSelector, function (err, result) {
        self.emit(&apos;article&apos;, err, result);
        roll();
    });
}
Model.prototype = Object.create(events.EventEmitter.prototype);

var results = {};
var m = new Model(db, &apos;users&apos;, &apos;articles&apos;, { username:&apos;lili&apos; }, { articleID:&apos;123456&apos; });

m
.on(&apos;user&apos;, function (err, result) { 
    results[&apos;user&apos;] = {err:err, result:result};
})
.on(&apos;article&apos;, function (err, result) {
    results[&apos;article&apos;] = {err:err, result:result};
})
.on(&apos;end&apos;, function () {
    console.log(&apos;-- results: &apos;, results);
});&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;编写的思想是:&lt;br&gt;&lt;strong&gt;&lt;em&gt;先使用构造器，编写出我们想要的逻辑结构，然后暴露事件接口。在外部通过事件来控制数据和状态。&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
</description><author>tulayang</author><pubDate>Fri, 05 Sep 2014 01:21:38 GMT</pubDate></item><item><title>基于koa做了个个人博客，求拍死</title><link>http://cnodejs.org/topic/540899bf2e53eba05a0c2d74</link><guid>http://cnodejs.org/topic/540899bf2e53eba05a0c2d74</guid><description>&lt;p&gt;基于nodejs koa+mongodb，用markdown语法来写博客，思路非常主流。&lt;br&gt;其实3个月之前用express做了一个，一直没有放上去，这次换成koa之后，摆脱了那些callback简直不要太爽。&lt;br&gt;&lt;a href=&quot;https://github.com/flex1988/Node_blog_V2&quot;&gt;代码&lt;/a&gt;&lt;br&gt;目前部署在阿里云，&lt;a href=&quot;http://114.215.152.65/&quot;&gt;链接&lt;/a&gt;&lt;br&gt;这个div+css是目前努力了半个月的最高水平了，模板和css也乱的一比，不喜欢拍死我把。&lt;br&gt;才发现markdown编辑器用的和cnode一样的~&lt;/p&gt;
</description><author>flex1988</author><pubDate>Thu, 04 Sep 2014 16:56:31 GMT</pubDate></item><item><title>咨询一个关于Express模板加载的问题</title><link>http://cnodejs.org/topic/540891adf4d8f79a5a0a462e</link><guid>http://cnodejs.org/topic/540891adf4d8f79a5a0a462e</guid><description>&lt;p&gt;我现在想基于Express开发一个web应用，能在其上面扩展许多子应用，每个子应用可以设置自己的路由以及模板。&lt;/p&gt;
&lt;p&gt;所以我希望在不同子应用内调用Express的 &lt;code&gt;res.render(&amp;#39;layout&amp;#39;, data);&lt;/code&gt; 的时候，能从当前子应用设置的模板目录中查找，而不是从Express设置的&lt;code&gt;views&lt;/code&gt;对应的目录中查找。&lt;/p&gt;
&lt;p&gt;基于Express的情况下有木有方法实现？&lt;/p&gt;
</description><author>sarike</author><pubDate>Thu, 04 Sep 2014 16:22:05 GMT</pubDate></item><item><title>Restify里面的res.send(obj)和next()的关系</title><link>http://cnodejs.org/topic/54088bf12e53eba05a096fdc</link><guid>http://cnodejs.org/topic/54088bf12e53eba05a096fdc</guid><description>&lt;p&gt;Restify里面是推荐处理任何一个请求的时候，如果传递的参数是形如function(req, res, next) { }的话，那么这个方法体里面最好是以next()；结束。但是如果我本身这个方法体里面已经做了res.send(obj)；了之后，那么next()；写与不写，都已经不需要了吧。求认同。&lt;/p&gt;
</description><author>zdwen</author><pubDate>Thu, 04 Sep 2014 15:57:37 GMT</pubDate></item><item><title>教你如何快速掌握Chrome DevTools中的各种NB技能~~</title><link>http://cnodejs.org/topic/540880ebf4d8f79a5a0706df</link><guid>http://cnodejs.org/topic/540880ebf4d8f79a5a0706df</guid><description>&lt;p&gt;follow twitter 上的这位就行了  &lt;a href=&quot;https://twitter.com/umaar&quot;&gt;Umar Hansa&lt;/a&gt; 。(&lt;em&gt;^__^&lt;/em&gt;) &lt;/p&gt;
</description><author>okoala</author><pubDate>Thu, 04 Sep 2014 15:10:35 GMT</pubDate></item><item><title>请问一下，各位知道的比较著名的前端开发开源网站有哪几个？</title><link>http://cnodejs.org/topic/54087e9d2e53eba05a06c2a1</link><guid>http://cnodejs.org/topic/54087e9d2e53eba05a06c2a1</guid><description></description><author>sulamiann</author><pubDate>Thu, 04 Sep 2014 15:00:45 GMT</pubDate></item><item><title>fs.exists问题</title><link>http://cnodejs.org/topic/54087e51f4d8f79a5a068451</link><guid>http://cnodejs.org/topic/54087e51f4d8f79a5a068451</guid><description>&lt;p&gt;&lt;strong&gt;在本机调试fs.exists没问题好好的，可是上传到Linux服务器之后，判断出现问题，绝对路径正常，相对路径返回false，有人遇到过么这是为什么..?&lt;/strong&gt;&lt;br&gt;/home/server/test.js （同目录下有一个main.js，路径写成“./main.js”也不行，“../server/main.js”也不行，只有写成“/home/server/main.js”才可以）&lt;br&gt;var fs = require(&amp;quot;fs&amp;quot;);&lt;br&gt;fs.exists(&amp;quot;main.js&amp;quot;, function(exsist){&lt;br&gt;    console.log(exsist);&lt;br&gt;});&lt;/p&gt;
&lt;p&gt;执行node /home/server/test.js&lt;br&gt;输出：false&lt;/p&gt;
</description><author>LayGit</author><pubDate>Thu, 04 Sep 2014 14:59:29 GMT</pubDate></item><item><title>nodeclub为啥不能在京东云擎上部署成功？求大牛解释</title><link>http://cnodejs.org/topic/5408754bf4d8f79a5a04b390</link><guid>http://cnodejs.org/topic/5408754bf4d8f79a5a04b390</guid><description>&lt;p&gt;nodeclub为啥不能在京东云擎上部署成功？求大牛解释&lt;/p&gt;
</description><author>luqin</author><pubDate>Thu, 04 Sep 2014 14:20:59 GMT</pubDate></item><item><title>跪求大神帮忙</title><link>http://cnodejs.org/topic/540867612e53eba05a01fb22</link><guid>http://cnodejs.org/topic/540867612e53eba05a01fb22</guid><description>&lt;p&gt; mongodb.open(function(err, db) {&lt;br&gt;    if (err) {&lt;br&gt;      return callback(err);&lt;br&gt;    }&lt;br&gt;    // 讀取 posts 集合&lt;br&gt;    db.collection(&amp;#39;posts&amp;#39;, function(err, collection) {&lt;br&gt;      if (err) {&lt;br&gt;        mongodb.close();&lt;br&gt;        return callback(err);&lt;br&gt;      }&lt;br&gt;      // 爲 user 屬性添加索引&lt;br&gt;      collection.ensureIndex(&amp;#39;user&amp;#39;);&lt;br&gt;      // 寫入 post 文檔&lt;br&gt;      collection.insert(post, {safe: true}, function(err, post) {&lt;br&gt;        mongodb.close();&lt;br&gt;        callback(err, post);&lt;br&gt;      });&lt;br&gt;    });&lt;br&gt;  });&lt;/p&gt;
&lt;p&gt;  这个是node开发指南的源码 db.collection(&amp;#39;posts&amp;#39;, function(err, collection) {这个里面的posts是从哪儿来的啊？跪求大神讲解&lt;/p&gt;
</description><author>fengchuantao</author><pubDate>Thu, 04 Sep 2014 13:21:37 GMT</pubDate></item><item><title>CNode的编辑器好棒，回复框以后也会支持吗？</title><link>http://cnodejs.org/topic/54085a73950d35c558003f41</link><guid>http://cnodejs.org/topic/54085a73950d35c558003f41</guid><description>&lt;p&gt; &lt;img src=&quot;http://cnode.qiniudn.com/FnivVcAdW3hqeAclIuhg2vm8BqQF&quot; alt=&quot;cat.png&quot;&gt;&lt;br&gt; 试试发一张图片。&lt;/p&gt;
</description><author>think2011</author><pubDate>Thu, 04 Sep 2014 12:26:27 GMT</pubDate></item><item><title>我是小白，问个关于socket.io的小白问题啊啊</title><link>http://cnodejs.org/topic/54084d1cec678ca654002987</link><guid>http://cnodejs.org/topic/54084d1cec678ca654002987</guid><description>&lt;p&gt;就是看官网上给出的聊天室例子，的确照着弄成功了。可是详细看代码时，发现index.html里都有这么一句：&lt;/p&gt;
&lt;script src=&quot;/socket.io/socket.io.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;这个应该是在客户端里读入socket.io.js。&lt;/p&gt;
&lt;p&gt;然后我的问题是，这个src的地址不对啊，我看来看去，在我的服务器上都没有这么个文件啊！我觉得应该是node_modules/socket.io/socket.io.js啊，为什么少了个node_modules？可是却执行的好好的，我是不是错过了什么？&lt;/p&gt;
</description><author>kfeng123</author><pubDate>Thu, 04 Sep 2014 11:29:32 GMT</pubDate></item><item><title>CNode 现在可以上传图片啦！！！！！！！！</title><link>http://cnodejs.org/topic/54084cd285c87ba854001a0d</link><guid>http://cnodejs.org/topic/54084cd285c87ba854001a0d</guid><description>&lt;p&gt;感谢 @vfasky 的 Pull Request ： &lt;a href=&quot;https://github.com/cnodejs/nodeclub/pull/388&quot;&gt;https://github.com/cnodejs/nodeclub/pull/388&lt;/a&gt; 。代码质量很高。&lt;/p&gt;
&lt;p&gt;现在在发布主题的时候，已经可以上传图片啦！图片存储的后端我们准备跟七牛谈谈合作，他家的服务存和取的速度都很快。&lt;/p&gt;
&lt;p&gt;回复框到时也会改为新编辑器的。&lt;/p&gt;
&lt;p&gt;试一张：&lt;/p&gt;
&lt;p&gt; &lt;img src=&quot;http://cnode.qiniudn.com/Fjj8khDzfgY4cjs_FYEk5kf-8_nK&quot; alt=&quot;QQ20140904-2.png&quot;&gt;&lt;/p&gt;
</description><author>alsotang</author><pubDate>Thu, 04 Sep 2014 11:28:18 GMT</pubDate></item><item><title>express4.8之microblog学习笔记</title><link>http://cnodejs.org/topic/540833010256839f71e05fdc</link><guid>http://cnodejs.org/topic/540833010256839f71e05fdc</guid><description>&lt;h1 id=&quot;-&quot;&gt;学习环境：&lt;/h1&gt;
&lt;p&gt;Node.js ： 0.10.31+Express ：4.8.6+MongoDB ： 2.6.4&lt;/p&gt;
&lt;h1 id=&quot;-&quot;&gt;学习例子：&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;nswbmw&lt;/strong&gt;的&lt;a href=&quot;https://github.com/nswbmw/N-blog/wiki/%E7%AC%AC1%E7%AB%A0--%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E5%8D%9A%E5%AE%A2&quot;&gt;一个简单的博客&lt;/a&gt;&lt;br&gt;我将按照例子中的章节依次列出遇到的问题以及解决的方法。&lt;/p&gt;
&lt;h1 id=&quot;start&quot;&gt;START&lt;/h1&gt;
&lt;h2 id=&quot;-1-&quot;&gt;第1章 一个简单的博客&lt;/h2&gt;
&lt;h3 id=&quot;-express&quot;&gt;安装 Express&lt;/h3&gt;
&lt;p&gt;npm install -g express-generator&lt;br&gt;4.0+版本中将命令工具分出来了，所以可以不安装express，但必须要安装express-generator&lt;/p&gt;
&lt;h3 id=&quot;-&quot;&gt;新建一个工程&lt;/h3&gt;
&lt;p&gt;node app不管用了，因为建服务器的代码写进了bin/www,你可以用npm start来建服务器，等同于node bin/www，如果你安装了supervisor，可以直接用supervisor bin/www来运行服务器。&lt;/p&gt;
&lt;h3 id=&quot;-&quot;&gt;工程结构&lt;/h3&gt;
&lt;p&gt;这块儿改动挺大的，可以对比代码看一下，不必按照作者去改代码，保持原样即可。&lt;/p&gt;
&lt;h3 id=&quot;-&quot;&gt;路由控制&lt;/h3&gt;
&lt;p&gt;这段看一下就好了，可以试着改一下，但是记得还原&lt;/p&gt;
&lt;h3 id=&quot;-&quot;&gt;搭建多人博客&lt;/h3&gt;
&lt;h4 id=&quot;-&quot;&gt;路由规划&lt;/h4&gt;
&lt;p&gt;实际上4.x已经是在index.js里面规划路由就好了，不用向上一章那样各种修改，你想添加一个路由控制，直接在后面添加&lt;br&gt;router.get(&amp;#39;/&amp;#39;, function(req, res) {&lt;br&gt;});或者&lt;br&gt;router.post(&amp;#39;/&amp;#39;, function(req, res) {&lt;br&gt;});就好了&lt;/p&gt;
&lt;h3 id=&quot;-mongodb&quot;&gt;连接MongoDB&lt;/h3&gt;
&lt;p&gt;需要在app.js引入express-session&lt;br&gt;var session = require(&amp;#39;express-session&amp;#39;);&lt;br&gt;然后添加：&lt;br&gt;app.use(cookieParser());//这个已经有了就不用添加了&lt;br&gt;app.use(session({  //这个要放在app(flash())（后面会添加）之前，app(flash())要放在app.use(&amp;#39;/&amp;#39;, routes);之前&lt;br&gt;  secret: settings.cookieSecret,&lt;br&gt;  key: settings.db,//cookie name&lt;br&gt;  cookie: {maxAge: 1000 &lt;em&gt; 60 &lt;/em&gt; 60 &lt;em&gt; 24 &lt;/em&gt; 30},//30 days&lt;br&gt;  store: new MongoStore({&lt;br&gt;    db: settings.db&lt;br&gt;  })&lt;br&gt;}));&lt;/p&gt;
&lt;h4 id=&quot;-&quot;&gt;页面权限控制&lt;/h4&gt;
&lt;p&gt;这一块我感觉post前面可以不用判断是否登录吧？&lt;/p&gt;
&lt;h2 id=&quot;-3-&quot;&gt;第3章 增加文件上传功能&lt;/h2&gt;
&lt;p&gt;express4.x在body-parse中间件里已经不在处理multipart/form-data，所以你们会发现req.files的files为undefined，请使用其他中间件，我用的是&lt;a href=&quot;https://github.com/expressjs/multer&quot;&gt;multer&lt;/a&gt;，在依赖中引入multer。在app.js中添加：&lt;br&gt;var multer  = require(&amp;#39;multer&amp;#39;);&lt;br&gt;app.use(multer({ dest: &amp;#39;./public/images/&amp;#39;}));&lt;br&gt;multer默认是保留后缀，并且自动删除了空文件的，所以路由控制代码如下：&lt;br&gt;router.post(&amp;#39;/upload&amp;#39;, function (req, res) {&lt;br&gt;  for (var i in req.files) {&lt;br&gt;    var target_path = &amp;#39;./public/images/&amp;#39; + req.files[i].originalname;&lt;br&gt;    // 使用同步方式重命名一个文件&lt;br&gt;    fs.renameSync(req.files[i].path, target_path);&lt;br&gt;    console.log(&amp;#39;Successfully renamed a file!&amp;#39;);&lt;br&gt;  }&lt;br&gt;  req.flash(&amp;#39;success&amp;#39;, &amp;#39;文件上传成功!&amp;#39;);&lt;br&gt;  res.redirect(&amp;#39;/upload&amp;#39;);&lt;br&gt;});&lt;br&gt;这里有一个前面埋下的坑，第一章时作者建议我们建立一个启动app的文件，但是一定要把这个文件建立在根目录下，否则你上传图片会上传到启动app.bat的目录下。&lt;/p&gt;
&lt;h2 id=&quot;-5-&quot;&gt;第5章 增加编辑与删除功能&lt;/h2&gt;
&lt;p&gt;本章遇到的问题是如果title是中文，编辑完之后跳的url最后是“乱码”，有人告诉url要两次编码再解码，如下：&lt;br&gt;url=encodeURI(url);&lt;br&gt;url=encodeURI(url);&lt;br&gt;url=decodeURI(url);&lt;br&gt;确实有效，但是最后我发现url编码一次就行了，也无需解码。难道“乱码”问题是因为redirect会自动对url解码么,所以只要对中文编码一次就好了？求大神指教。&lt;/p&gt;
</description><author>yuu2lee4</author><pubDate>Thu, 04 Sep 2014 09:38:09 GMT</pubDate></item><item><title>有喜欢开发node.js Real time 架构没</title><link>http://cnodejs.org/topic/540826da0256839f71dd9969</link><guid>http://cnodejs.org/topic/540826da0256839f71dd9969</guid><description>&lt;p&gt;git地址:&lt;a href=&quot;https://git.oschina.net/atlatl333/webim&quot;&gt;https://git.oschina.net/atlatl333/webim&lt;/a&gt;&lt;/p&gt;
</description><author>antianlu</author><pubDate>Thu, 04 Sep 2014 08:46:18 GMT</pubDate></item><item><title>读写大文件导致内存溢出(FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory)</title><link>http://cnodejs.org/topic/5408202be84941a571dfb9b6</link><guid>http://cnodejs.org/topic/5408202be84941a571dfb9b6</guid><description>&lt;p&gt;菜鸟请教各位，下面的代码有问题吗？有没有另外一种可能，服务器网速慢，读写速度不一致导致内存溢出呢？&lt;/p&gt;
&lt;pre class=&quot;prettyprint language-js\n&quot;&gt;&lt;code&gt;self._init(filePath, function() {
                var config = self.config;
                resp = self.resp;
                fReadStream = fs.createReadStream(filePath, {
                    encoding : &apos;binary&apos;,
                    bufferSize : 1024 * 1024,
                    start : config.startPos,
                    end : config.fileSize
                });
                fReadStream.on(&apos;data&apos;, function(chunk) {
                    resp.write(chunk, &apos;binary&apos;);
                });
                fReadStream.on(&apos;end&apos;, function() {
                    resp.end();
                });
            });&lt;/code&gt;&lt;/pre&gt;</description><author>liuff1988</author><pubDate>Thu, 04 Sep 2014 08:17:47 GMT</pubDate></item><item><title>Nodejs发邮件组件Nodemailer</title><link>http://cnodejs.org/topic/54081ecb0256839f71dbd340</link><guid>http://cnodejs.org/topic/54081ecb0256839f71dbd340</guid><description>&lt;p&gt;&lt;img src=&quot;http://blog.fens.me/wp-content/uploads/2014/09/nodejs-nodemailer.png&quot; alt=&quot;Nodejs发邮件组件Nodemailer&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;-&quot;&gt;前言：&lt;/h3&gt;
&lt;p&gt;电子邮件，是互联网应用最广泛使用的服务之一，通过电子邮件系统，我们可以与世界上任何一个角落的网络用户进行联系。&lt;/p&gt;
&lt;p&gt;使用Nodejs收发电子邮件也非常简单，Nodemailer包就可以帮助快速实现发邮件的功能。&lt;/p&gt;
&lt;h3 id=&quot;-&quot;&gt;文章目录：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Nodemailer包介绍&lt;/li&gt;
&lt;li&gt;使用Nodemailer发邮件&lt;/li&gt;
&lt;li&gt;发邮件的高级使用&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;-http-blog-fens-me-nodejs-email-nodemailer-&quot;&gt;请查看&lt;a href=&quot;http://blog.fens.me/nodejs-email-nodemailer/&quot;&gt;博客文章&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.fens.me/nodejs-email-nodemailer/&quot;&gt;http://blog.fens.me/nodejs-email-nodemailer/&lt;/a&gt;&lt;/p&gt;
</description><author>bsspirit</author><pubDate>Thu, 04 Sep 2014 08:11:55 GMT</pubDate></item><item><title>node.js搭建网站</title><link>http://cnodejs.org/topic/5408158fe84941a571dd30cb</link><guid>http://cnodejs.org/topic/5408158fe84941a571dd30cb</guid><description>&lt;p&gt;使用node.js如何在web前端显示图片logo&lt;/p&gt;
</description><author>xiaoxi--</author><pubDate>Thu, 04 Sep 2014 07:32:31 GMT</pubDate></item><item><title>express碰到一个很奇怪的问题，不知各位大神有没有遇到过？</title><link>http://cnodejs.org/topic/540805d90256839f71d62402</link><guid>http://cnodejs.org/topic/540805d90256839f71d62402</guid><description>&lt;p&gt;GET &lt;a href=&quot;http://localhost:3000/product/css/reset.css&quot;&gt;http://localhost:3000/product/css/reset.css&lt;/a&gt; 404 (Not Found) sdf:13&lt;br&gt;GET &lt;a href=&quot;http://localhost:3000/product/css/bootstrap.min.css&quot;&gt;http://localhost:3000/product/css/bootstrap.min.css&lt;/a&gt; 404 (Not Found) sdf:14&lt;br&gt;GET &lt;a href=&quot;http://localhost:3000/product/css/bootstrap-responsive.css&quot;&gt;http://localhost:3000/product/css/bootstrap-responsive.css&lt;/a&gt; 404 (Not Found) sdf:15&lt;br&gt;GET &lt;a href=&quot;http://localhost:3000/product/css/docs.css&quot;&gt;http://localhost:3000/product/css/docs.css&lt;/a&gt; 404 (Not Found) &lt;/p&gt;
&lt;p&gt;我在模板里面a标签写了&lt;code&gt;&amp;lt;a href=&amp;quot;/product/{{_id}}&amp;quot; class=&amp;quot;home-title&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/code&gt;，对应的路由可以获取到数据，但是加载静态资源的时候为什么会从product开始获取，而不是定义好的public，如果把product/{{_id}}改成productabc/{{_id}}那么就会从productabc获取，很奇怪。不知道为什么，求解!&lt;/p&gt;
</description><author>moJiXiang</author><pubDate>Thu, 04 Sep 2014 06:25:29 GMT</pubDate></item><item><title>杭州劲电科技招聘Node.js程序员</title><link>http://cnodejs.org/topic/5407fefbe84941a571d7e837</link><guid>http://cnodejs.org/topic/5407fefbe84941a571d7e837</guid><description>&lt;p&gt;团队成员来自一线游戏知名公司：网易、英佩，平均游戏开发经验4年以上。&lt;br&gt;产品介绍：主要研发3D横版APRG动作过关手游，代号《野兽都市》。&lt;br&gt;诚招有志之士，参与后端服务器建设。&lt;br&gt;后台程序员 2名&lt;br&gt;岗位要求：&lt;br&gt;1.服务器各逻辑模块的设计、开发和维护&lt;br&gt;2.开发工具和运维工具的开发和维护&lt;/p&gt;
&lt;p&gt;岗位要求：&lt;br&gt;1.熟悉javascript&lt;br&gt;2.了解游戏服务器开发&lt;br&gt;3.有Node js开发经验者&lt;/p&gt;
&lt;p&gt;简历投递要求：名字_岗位&lt;/p&gt;
&lt;p&gt;联系邮箱：hzjingdian2014@126.com      联系电话：0571-87685352&lt;br&gt; qq:1420771728  请注明验证消息&lt;br&gt; 地址：滨江区长河街道秋溢路288号东冠软件园1幢407室&lt;/p&gt;
</description><author>hzjigndian2014</author><pubDate>Thu, 04 Sep 2014 05:56:11 GMT</pubDate></item><item><title>《开发指南》express4.0 实现注册，出错...</title><link>http://cnodejs.org/topic/5407f84de84941a571d657b5</link><guid>http://cnodejs.org/topic/5407f84de84941a571d657b5</guid><description>&lt;p&gt;&lt;strong&gt;控制台报错信息：&lt;/strong&gt;&lt;br&gt;/Users/victor/mymicroblog/node_modules/mongodb/lib/mongodb/db.js:296&lt;br&gt;          throw err;&lt;br&gt;                ^&lt;br&gt;Error: Cannot use a writeConcern without a provided callback&lt;br&gt;    at Db.ensureIndex (/Users/victor/mymicroblog/node_modules/mongodb/lib/mongodb/db.js:1426:11)&lt;br&gt;    at Collection.ensureIndex (/Users/victor/mymicroblog/node_modules/mongodb/lib/mongodb/collection/index.js:65:11)&lt;br&gt;    at /Users/victor/mymicroblog/models/user.js:24:16&lt;br&gt;    at Db.collection (/Users/victor/mymicroblog/node_modules/mongodb/lib/mongodb/db.js:502:44)&lt;br&gt;    at /Users/victor/mymicroblog/models/user.js:19:6&lt;br&gt;    at /Users/victor/mymicroblog/node_modules/mongodb/lib/mongodb/db.js:293:11&lt;br&gt;    at process._tickCallback (node.js:419:13)&lt;br&gt;Program node app.js exited with code 8&lt;/p&gt;
</description><author>ChoCheckTsui</author><pubDate>Thu, 04 Sep 2014 05:27:41 GMT</pubDate></item><item><title>tweet 的例子无法用怎么改成能用的呢？</title><link>http://cnodejs.org/topic/5407be22e84941a571c96226</link><guid>http://cnodejs.org/topic/5407be22e84941a571c96226</guid><description>&lt;p&gt;module.exports= function (query, fn) {&lt;br&gt;    request.get(&amp;#39;&lt;a href=&quot;http://www.baidu.com/s&quot;&gt;http://www.baidu.com/s&lt;/a&gt;&amp;#39;)&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;     .data({wd:query})

    .end(function (res) {
        if(res.body&amp;&amp;Array.isArray(res.body.results)){
            return fn(null,res.body.results);
        }
        fn(new Error(&apos;Bad twitter response&apos;));
    });&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;};&lt;/p&gt;
&lt;p&gt;提示是TypeError: Object #&lt;Request&gt; has no method &amp;#39;data&amp;#39;&lt;br&gt;不知道哪里出问题了&lt;/p&gt;
</description><author>togetherWithNumbers</author><pubDate>Thu, 04 Sep 2014 01:19:30 GMT</pubDate></item><item><title>用过 pm2 指教一下哦，pm2 重启进程后，浏览器访问一直是请求等待中。。</title><link>http://cnodejs.org/topic/5406f3860256839f719d0421</link><guid>http://cnodejs.org/topic/5406f3860256839f719d0421</guid><description>&lt;p&gt;我故意写了个错误，第一次请求有效，日志里面错误也显示出来了，pm2 list看到进程也重新启动了，，但是用浏览器请求的时候一直在请求加载中，，不知道什么原因&lt;/p&gt;
&lt;p&gt;不过我本地是好的，就是线上不行，线上是CentOS 6.5&lt;/p&gt;
</description><author>faberii</author><pubDate>Wed, 03 Sep 2014 10:55:02 GMT</pubDate></item><item><title>爱知乎 - 知乎日报网页版 开源了</title><link>http://cnodejs.org/topic/5406ea09e84941a5719d45c5</link><guid>http://cnodejs.org/topic/5406ea09e84941a5719d45c5</guid><description>&lt;p&gt;repo: &lt;a href=&quot;https://github.com/nihgwu/iZhihu&quot;&gt;https://github.com/nihgwu/iZhihu&lt;/a&gt;&lt;br&gt;详细的说明可以看&lt;a href=&quot;http://liteneo.com/tags/%E7%88%B1%E7%9F%A5%E4%B9%8E/&quot;&gt;我的博客&lt;/a&gt;&lt;br&gt;希望对学习 Node.js 的朋友有所帮助&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://youzhihu.com/&quot;&gt;爱知乎&lt;/a&gt;&lt;br&gt;我一直觉得这个站功能很简单，实现起来也很容易，开源与否其实没多大意义，精力花费的最多的反而是修改样式，页面布局基本上是不懂美工的我边修改边查看一行行码起来的，从最早的用 BlockIt 实现瀑布流到后来直接用浮动样式，去掉了 Lazyload 到后来的不同分辨率的适配，甚至还花了很多精力去适配老版本的 IE。。。&lt;/p&gt;
&lt;p&gt;所以我后来又做了一个类似的站 &lt;a href=&quot;http://thehours.jd-app.com/&quot;&gt;时时刻刻&lt;/a&gt; 就不怎么上心了 XD&lt;/p&gt;
</description><author>nihgwu</author><pubDate>Wed, 03 Sep 2014 10:14:33 GMT</pubDate></item><item><title>自定义HTML标签，直接在网页中写MarkDown和数学公式。</title><link>http://cnodejs.org/topic/5406e067e84941a5719b2beb</link><guid>http://cnodejs.org/topic/5406e067e84941a5719b2beb</guid><description>&lt;h3 id=&quot;-lt-x-md-gt-&quot;&gt;&amp;lt;x-md&amp;gt;&lt;/h3&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;            markdown标签&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;-lt-x-math-gt-&quot;&gt;&amp;lt;x-math&amp;gt;&lt;/h3&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;            LaTeX标签&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;-&quot;&gt;例子&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://tongyongwangzhi.duapp.com&quot;&gt;点这里&lt;/a&gt;，View page source。&lt;/p&gt;
&lt;h3 id=&quot;-&quot;&gt;看的懂并且有兴趣，可以联系我。&lt;/h3&gt;
</description><author>gzhangzy</author><pubDate>Wed, 03 Sep 2014 09:33:27 GMT</pubDate></item><item><title>node.js express框架 form表单 action属性</title><link>http://cnodejs.org/topic/5406a8930256839f718cd64c</link><guid>http://cnodejs.org/topic/5406a8930256839f718cd64c</guid><description>&lt;p&gt;form表单的action属性是：规定当提交表单时向何处发送表单数据。怎么样理解这句话？&lt;br&gt;前端产生表单的文件为：views文件夹下的index.ejs&lt;br&gt;后端处理表单的文件为：routes文件夹下的handlepost.js文件，那么form表单中的action属性如何填写了？&lt;/p&gt;
</description><author>kingche</author><pubDate>Wed, 03 Sep 2014 05:35:15 GMT</pubDate></item><item><title>换个问法：如何通过addon来调用 module._compile 方法</title><link>http://cnodejs.org/topic/5406a37a0256839f718bb42c</link><guid>http://cnodejs.org/topic/5406a37a0256839f718bb42c</guid><description>&lt;p&gt;我想直接在 &lt;strong&gt;addon&lt;/strong&gt; 内 &lt;strong&gt;compile&lt;/strong&gt; 代码，然后返回 &lt;strong&gt;exports&lt;/strong&gt;。&lt;br&gt;主要用途是加密某些核心代码，通过&lt;strong&gt;内部解密并编译&lt;/strong&gt;使用。使之不会被轻易的 &lt;strong&gt;toString()&lt;/strong&gt; 出来&lt;br&gt;请问有高手尝试过吗&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;// Native extension for .js
Module._extensions[&apos;.js&apos;] = function(module, filename) {
  var content = NativeModule.require(&apos;fs&apos;).readFileSync(filename, &apos;utf8&apos;);

  // 就是这行代码
  module._compile(stripBOM(content), filename);
};&lt;/code&gt;&lt;/pre&gt;</description><author>tracking</author><pubDate>Wed, 03 Sep 2014 05:13:30 GMT</pubDate></item><item><title>socket 用disconnect 断开，再重新连接怎么搞</title><link>http://cnodejs.org/topic/54068e5a0256839f718798ca</link><guid>http://cnodejs.org/topic/54068e5a0256839f718798ca</guid><description>&lt;p&gt;  var socket;&lt;br&gt;function a(room){&lt;br&gt;    room =&amp;#39;help&amp;#39;;&lt;br&gt;    var uid=1;&lt;br&gt;    socket =new io.connect(&amp;#39;&lt;a href=&quot;http://localhost:8082&amp;#39;,{&amp;#39;reconnect&amp;#39;:true,&amp;#39;auto&quot;&gt;http://localhost:8082&amp;#39;,{&amp;#39;reconnect&amp;#39;:true,&amp;#39;auto&lt;/a&gt; connect&amp;#39;:true});&lt;br&gt;    socket.on(&amp;#39;conn&amp;#39;, function (data) {&lt;br&gt;      var postdata={&amp;#39;c_id&amp;#39;:room,&amp;#39;u_id&amp;#39;:uid}&lt;br&gt;        socket.emit(&amp;#39;login&amp;#39;,postdata,function(result){&lt;br&gt;            console.log(&amp;quot;success....&amp;quot;);&lt;br&gt;        });&lt;br&gt;    });&lt;br&gt;}&lt;/p&gt;
&lt;p&gt;function b(){&lt;br&gt;    socket.socket.disconnect();&lt;br&gt;}&lt;/p&gt;
&lt;p&gt;我先用a()连接登录，，后来用b() 退出，，我在想用a（）连接怎么就连不上了。。。要怎么搞，，求助。。。。&lt;/p&gt;
</description><author>node-ds</author><pubDate>Wed, 03 Sep 2014 03:43:22 GMT</pubDate></item><item><title>请教大家一个cookie缓存的问题</title><link>http://cnodejs.org/topic/5406876de84941a57187f19b</link><guid>http://cnodejs.org/topic/5406876de84941a57187f19b</guid><description>&lt;p&gt;我现在就是想在客户端清楚某一个cookie，但是貌似有缓存该cookie一直清除不掉，必须重启浏览器以后的第一次清除操作是能够成功的，之后又会出现清除不到的问题，求解！！！&lt;/p&gt;
</description><author>hc2014</author><pubDate>Wed, 03 Sep 2014 03:13:49 GMT</pubDate></item><item><title>怎么用node监听某个文件新增的内容</title><link>http://cnodejs.org/topic/54067dd80256839f71843dcb</link><guid>http://cnodejs.org/topic/54067dd80256839f71843dcb</guid><description>&lt;h3 id=&quot;-&quot;&gt;日志文件&lt;/h3&gt;
&lt;p&gt;我需要不停的监听日志文件。&lt;br&gt;每当有新的内容增加的时候 ， 我需要把这新增的内容给捕捉到。&lt;br&gt;用tail -f的方式貌似不太好，还有什么好的方式吗？&lt;/p&gt;
</description><author>myhirra</author><pubDate>Wed, 03 Sep 2014 02:32:56 GMT</pubDate></item><item><title>monk和mongoose都能操作mongodb，如何比较一下二者</title><link>http://cnodejs.org/topic/5406777be84941a57184a031</link><guid>http://cnodejs.org/topic/5406777be84941a57184a031</guid><description></description><author>andylee2014</author><pubDate>Wed, 03 Sep 2014 02:05:47 GMT</pubDate></item><item><title>NODE小白，请问使用Bower install bootstrap命令如何应用到Express中去？</title><link>http://cnodejs.org/topic/54067234e84941a5718371dd</link><guid>http://cnodejs.org/topic/54067234e84941a5718371dd</guid><description>&lt;p&gt;如题。在Express项目中使用命令bower install bootstrap出现一个bower _components的文件夹，怎么应用到express的项目中&lt;/p&gt;
</description><author>dainash</author><pubDate>Wed, 03 Sep 2014 01:43:16 GMT</pubDate></item></channel></rss>