<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[刘新修]]></title> 
<link>http://liuxinxiu.com:80/index.php</link> 
<description><![CDATA[刘新修的个人博客 (Liuxinxiu'S Blog)]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[刘新修]]></copyright>
<item>
<link>http://liuxinxiu.com:80/s/305/</link>
<title><![CDATA[Nodejs搭建简单的websocket服务]]></title> 
<author>刘新修 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[NodeJs平台]]></category>
<pubDate>Wed, 23 Nov 2022 06:11:34 +0000</pubDate> 
<guid>http://liuxinxiu.com:80/s/305/</guid> 
<description>
<![CDATA[ 
	<div style="color: rgb(212, 212, 212); background-color: rgb(30, 30, 30); font-family: Consolas, &quot;Courier New&quot;, monospace; line-height: 19px; white-space: pre;"><div><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">ws</span> = <span style="color: #dcdcaa;">require</span>(<span style="color: #ce9178;">&quot;nodejs-websocket&quot;</span>);</div><br /><div><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">PORT</span> = <span style="color: #b5cea8;">3002</span>;</div><div><span style="color: #569cd6;">let</span> <span style="color: #9cdcfe;">server</span> = <span style="color: #9cdcfe;">ws</span>.<span style="color: #dcdcaa;">createServer</span>((<span style="color: #9cdcfe;">conn</span>) <span style="color: #569cd6;">=&gt;</span> &#123;</div><div>&nbsp; &nbsp; <span style="color: #9cdcfe;">console</span>.<span style="color: #dcdcaa;">log</span>(<span style="color: #ce9178;">'连接成功'</span>);</div><br /><div>&nbsp; &nbsp; <span style="color: #6a9955;">/*** 错误处理 ***/</span></div><div>&nbsp; &nbsp; <span style="color: #9cdcfe;">conn</span>.<span style="color: #dcdcaa;">on</span>(<span style="color: #ce9178;">&quot;error&quot;</span>, ()<span style="color: #569cd6;">=&gt;</span> &#123;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #9cdcfe;">console</span>.<span style="color: #dcdcaa;">log</span>(<span style="color: #ce9178;">&quot;error&quot;</span>);</div><div>&nbsp; &nbsp; &#125;)</div><br /><div>&nbsp; &nbsp; <span style="color: #6a9955;">/*** 关闭处理 ***/</span></div><div>&nbsp; &nbsp; <span style="color: #9cdcfe;">conn</span>.<span style="color: #dcdcaa;">on</span>(<span style="color: #ce9178;">&quot;close&quot;</span>, ()<span style="color: #569cd6;">=&gt;</span> &#123;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #9cdcfe;">console</span>.<span style="color: #dcdcaa;">log</span>(<span style="color: #ce9178;">&quot;连接关闭&quot;</span>);</div><div>&nbsp; &nbsp; &#125;)</div><br /><div>&nbsp; &nbsp; <span style="color: #6a9955;">/*** 业务逻辑 ***/</span></div><div>&nbsp; &nbsp; <span style="color: #9cdcfe;">conn</span>.<span style="color: #dcdcaa;">on</span>(<span style="color: #ce9178;">&quot;text&quot;</span>, (<span style="color: #9cdcfe;">data</span>)<span style="color: #569cd6;">=&gt;</span> &#123;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #9cdcfe;">conn</span>.<span style="color: #dcdcaa;">send</span>(<span style="color: #ce9178;">`后端对数据处理并返回 </span><span style="color: #569cd6;">$&#123;</span><span style="color: #9cdcfe;">data</span>.<span style="color: #dcdcaa;">toUpperCase</span>()<span style="color: #569cd6;">&#125;</span><span style="color: #ce9178;">`</span>)</div><div>&nbsp; &nbsp; &#125;)</div><br /><div>&#125;);</div><br /><div><span style="color: #9cdcfe;">server</span>.<span style="color: #dcdcaa;">listen</span>(<span style="color: #4fc1ff;">PORT</span>, ()<span style="color: #569cd6;">=&gt;</span> &#123;</div><div>&nbsp; &nbsp; <span style="color: #9cdcfe;">console</span>.<span style="color: #dcdcaa;">log</span>(<span style="color: #ce9178;">&quot;服务器启动成功，监听了端口: &quot;</span> + <span style="color: #4fc1ff;">PORT</span>)</div><div>&#125;);</div></div>
]]>
</description>
</item><item>
<link>http://liuxinxiu.com:80/s/294/</link>
<title><![CDATA[初入大前端小白们，需要明白的几个概念问题（持续更新）]]></title> 
<author>刘新修 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[NodeJs平台]]></category>
<pubDate>Tue, 03 Sep 2019 06:36:21 +0000</pubDate> 
<guid>http://liuxinxiu.com:80/s/294/</guid> 
<description>
<![CDATA[ 
	<p><span style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;">1， npm install是帮助安装 vue,或React到本地，npm install也可以安装vue,React的开发工具。当然你完全可以像jQuery一样自己找网站下载下来，在页面中引入。</span><br style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;" /><span style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;">2,没有npm可以使用vue，vue只是一个前端框架。</span><br style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;" /><span style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;">3，4，node是js的服务执行环境，前端常常借助 node帮助前端实现工程化。很多工具是基于node的，比如说你说的webpack,grunt。</span><br style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;" /><span style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;">5，webpack,grunt是前端工程化的工具，可以帮助前端完成混淆压缩，校验等工作。</span><br style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;" /><span style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;">6，7，实战中没用过，请参考官方文档</span><a href="http://cn.vuejs.org/v2/guide/ssr.html" style="outline: 0px; text-decoration-line: none; color: rgb(0, 136, 204); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;">http://cn.vuejs.org/v2/guide/...</a><br style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;" /><span style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;">8，可以单纯的利用 php+vue或者php+react开发。</span><br style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;" /><span style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;">9，最后一个问题太大，可以写本书。而且老实讲，一切都需要实战中才能有更深的体会。</span><br style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;" /><span style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;">最后总结一下：</span><br style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;" /><span style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;">前端圈所谓得&ldquo;乱&rdquo;，一个是近些年前端框架层出不穷，工程化，解决方案越来越多，已经脱离了一般人认为的那个&ldquo;好单纯好不做作&rdquo;的前端。就像后端开发有很多工具协作开发一样，前端也需要越来越多的工作完成前端面临巨大的工作量。 前端的行业发展已经不是那种后端在php,jsp中写一些html,前端来写一些css来完成工作的阶段。老实讲，我现在80%的时间在写js。前端已经不是后端开发的最后一步甚至&ldquo;附属品&rdquo;，而成为真正意义的&ldquo;客户端&rdquo;。复杂度也就慢慢和app等客户端越来越接近。</span><br style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;" /><span style="color: rgb(28, 31, 33); font-family: &quot;PingFang SC&quot;, 微软雅黑, &quot;Microsoft YaHei&quot;, Helvetica, &quot;Helvetica Neue&quot;, Tahoma, Arial, sans-serif; font-size: 16px;">总的来说，你还是可以按照原先的开发方式来开发自己的应用，当然考虑引进工具一些先进的理念方法来协助开发。node,webpack,vue这些概念不应该成为自己开发中的阻碍，而是在自己在面临一些问题时的利剑。这些概念的学习需要一天一天的来，毕竟一口吃不成个胖子 ：)</span></p><p>&nbsp;</p><p><span style="font-size:16px;"><strong>什么是npm?</strong><br />从事网站制作的小前端们都知道cdn的概念，也就是在网站制作中如果我们需要jquery或者bootstrap等文件支持的话，就可以通过cdn引入的方式来实现调用。由于node的使用日益广泛，也带动了其组件npm的使用，而npm就是这些jquery以及bootstrap这些文件包的组合管理器。现在只要使用了node环境进行web网站开发，你就可以直接用npm进行调用以前所有的cdn文件了。<br /><br /><strong>什么是webpack？</strong><br />webpack简单来说就是前端代码资源的包管理工具，他自动整理你的项目结构，结合javascript的模块化组件，机型解析并交给浏览器渲染使用，大大提高前端的开发效率。<br /><br /><strong>什么是vue-cli？它与vue脚手架有什么关系？</strong><br />其实vue-cli就是vue的脚手架，vue脚手架的作用是用来自动一键生成vue+webpack的项目模版，包括依赖库，免去你手动安装各种插件，寻找各种cdn并一个个引入的麻烦。<br /><br /><strong>什么是node.js？它与vue具体有什么关系？</strong><br />提到vue就不得不说node了，vue作为一个前端框架技术，主要负责了数据渲染，界面展示效果，由于其易用性及便捷的维护应用日益广泛。而node作为一个服务器端语言，它是以javascript语言为基础的服务端程序语言，在实际的项目开发中，前端人员只要实现了环境的搭建，其实就可以仅仅从后台拿api接口进行数据调用，从而全部完成整个前端项目的展示。<br /><br />前端由于近两年web前端技术发展革新速度飞快，一旦错过了，可能重新学的速度是非常慢的，只要尽早入手才能获得最好的学习效果。全栈网络专业从事郑州网站制作，我们也有专业的网站制作团队，愿意为每一个前端人员提供最新的前端知识分享。</span></p>
]]>
</description>
</item><item>
<link>http://liuxinxiu.com:80/nodeJs_co/</link>
<title><![CDATA[co最简版实现，学习generator amp; co]]></title> 
<author>刘新修 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[NodeJs平台]]></category>
<pubDate>Tue, 11 Jul 2017 02:41:59 +0000</pubDate> 
<guid>http://liuxinxiu.com:80/nodeJs_co/</guid> 
<description>
<![CDATA[ 
	<p>&nbsp;<span style="color: rgb(51, 51, 51); font-family: &quot;Helvetica Neue&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, Tahoma, &quot;Hiragino Sans GB&quot;, STHeiti, sans-serif; font-size: 15px; white-space: pre-wrap;">看了co的源码 比较难懂 了解了其原理后实现了一个最简版本https://github.com/yucong/simple-co 希望对想学习的tx有帮助～ yeild后面只支持thunk，co本身也是一个thunk 核心代码：</span></p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">function</span><span>&nbsp;co(generator)&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">function</span><span>(fn)&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;gen&nbsp;=&nbsp;generator();&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;next(err,&nbsp;result)&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(err)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;fn(err);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;step&nbsp;=&nbsp;gen.next(result);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!step.done)&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;step.value(next);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;<span class="keyword">else</span><span>&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn(<span class="keyword">null</span><span>,&nbsp;step.value);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;next();&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&#125;&nbsp;&nbsp;</span></li></ol></div><p>用法：</p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">var</span><span>&nbsp;co&nbsp;=&nbsp;require(</span><span class="string">'./co'</span><span>);&nbsp;&nbsp;</span></span></li><li><span><span class="comment">//&nbsp;wrap&nbsp;the&nbsp;function&nbsp;to&nbsp;thunk</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="keyword">function</span><span>&nbsp;readFile(filename)&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">function</span><span>(callback)&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;require(<span class="string">'fs'</span><span>).readFile(filename,&nbsp;</span><span class="string">'utf8'</span><span>,&nbsp;callback);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;;&nbsp;&nbsp;</span></li><li class="alt"><span>&#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>co(<span class="keyword">function</span><span>&nbsp;*&nbsp;()&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;file1&nbsp;=&nbsp;yield&nbsp;readFile(</span><span class="string">'./file/a.txt'</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;file2&nbsp;=&nbsp;yield&nbsp;readFile(</span><span class="string">'./file/b.txt'</span><span>);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(file1);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(file2);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">'done'</span><span>;&nbsp;&nbsp;</span></span></li><li><span>&#125;)(<span class="keyword">function</span><span>(err,&nbsp;result)&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(result)&nbsp;&nbsp;</span></li><li><span>&#125;);&nbsp;&nbsp;</span></li></ol></div><p><span style="color: rgb(51, 51, 51); font-family: &quot;Helvetica Neue&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, Tahoma, &quot;Hiragino Sans GB&quot;, STHeiti, sans-serif; font-size: 15px; white-space: pre-wrap;">会打印出： content in a.txt content in b.txt done</span></p><p>&nbsp;</p><p><span style="color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">下面做个简单对比：</span><br style="box-sizing: border-box; color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;" /><span style="color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">传统方式，</span><code style="box-sizing: border-box; font-family: &quot;Source Code Pro&quot;, Consolas, Menlo, Monaco, &quot;Courier New&quot;, monospace; font-size: 0.93em; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;">sayhello</code><span style="color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">是一个异步函数，执行</span><code style="box-sizing: border-box; font-family: &quot;Source Code Pro&quot;, Consolas, Menlo, Monaco, &quot;Courier New&quot;, monospace; font-size: 0.93em; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;">helloworld</code><span style="color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">会先输出</span><code style="box-sizing: border-box; font-family: &quot;Source Code Pro&quot;, Consolas, Menlo, Monaco, &quot;Courier New&quot;, monospace; font-size: 0.93em; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;">&quot;world&quot;</code><span style="color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">再输出</span><code style="box-sizing: border-box; font-family: &quot;Source Code Pro&quot;, Consolas, Menlo, Monaco, &quot;Courier New&quot;, monospace; font-size: 0.93em; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;">&quot;hello&quot;</code><span style="color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">。</span></p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">function</span><span>&nbsp;sayhello()&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;Promise.resolve(</span><span class="string">'hello'</span><span>).then(</span><span class="keyword">function</span><span>(hello)&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(hello);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;);&nbsp;&nbsp;</span></li><li class="alt"><span>&#125;&nbsp;&nbsp;</span></li><li><span><span class="keyword">function</span><span>&nbsp;helloworld()&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;sayhello();&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">'world'</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#125;&nbsp;&nbsp;</span></li><li><span>helloworld();&nbsp;&nbsp;</span></li></ol></div><p><span style="color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">输出</span></p><p>&nbsp;</p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>&gt;&nbsp;</span><span class="string">&quot;world&quot;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&gt;&nbsp;<span class="string">&quot;hello&quot;</span><span>&nbsp;&nbsp;</span></span></li></ol></div><p><span style="color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">co 的方式，会先输出</span><code style="box-sizing: border-box; font-family: &quot;Source Code Pro&quot;, Consolas, Menlo, Monaco, &quot;Courier New&quot;, monospace; font-size: 0.93em; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;">&quot;hello&quot;</code><span style="color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">再输出</span><code style="box-sizing: border-box; font-family: &quot;Source Code Pro&quot;, Consolas, Menlo, Monaco, &quot;Courier New&quot;, monospace; font-size: 0.93em; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;">&quot;world&quot;</code><span style="color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">。</span></p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">function</span><span>&nbsp;co(gen)&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;it&nbsp;=&nbsp;gen();&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;ret&nbsp;=&nbsp;it.next();&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;ret.value.then(<span class="keyword">function</span><span>(res)&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it.next(res);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;);&nbsp;&nbsp;</span></li><li class="alt"><span>&#125;&nbsp;&nbsp;</span></li><li><span><span class="keyword">function</span><span>&nbsp;sayhello()&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;Promise.resolve(</span><span class="string">'hello'</span><span>).then(</span><span class="keyword">function</span><span>(hello)&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(hello);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;);&nbsp;&nbsp;</span></li><li><span>&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>co(<span class="keyword">function</span><span>&nbsp;*helloworld()&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;sayhello();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">'world'</span><span>);&nbsp;&nbsp;</span></span></li><li><span>&#125;);&nbsp;&nbsp;</span></li></ol></div><p><span style="color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">输出</span></p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>&gt;&nbsp;</span><span class="string">&quot;hello&quot;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&gt;&nbsp;<span class="string">&quot;world&quot;</span><span>&nbsp;&nbsp;</span></span></li></ol></div><p>&nbsp;</p><h2 id="articleHeader7" style="box-sizing: border-box; font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif; font-weight: 500; line-height: 1.2; color: rgb(51, 51, 51); margin: 1.5em 0px 0px; font-size: 1.75em; border-bottom: 1px solid rgb(238, 238, 238); padding-bottom: 10px;">消除回调金字塔</h2><p><span style="color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">假设</span><code style="box-sizing: border-box; font-family: &quot;Source Code Pro&quot;, Consolas, Menlo, Monaco, &quot;Courier New&quot;, monospace; font-size: 0.93em; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;">sayhello</code><span style="color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">/</span><code style="box-sizing: border-box; font-family: &quot;Source Code Pro&quot;, Consolas, Menlo, Monaco, &quot;Courier New&quot;, monospace; font-size: 0.93em; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;">sayworld</code><span style="color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">/</span><code style="box-sizing: border-box; font-family: &quot;Source Code Pro&quot;, Consolas, Menlo, Monaco, &quot;Courier New&quot;, monospace; font-size: 0.93em; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;">saybye</code><span style="color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">是三个异步函数，用真正的 co 模块就可以这么写：</span></p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">var</span><span>&nbsp;co&nbsp;=&nbsp;require(</span><span class="string">'co'</span><span>);&nbsp;&nbsp;</span></span></li><li><span>co(<span class="keyword">function</span><span>&nbsp;*()&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;sayhello();&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;sayworld();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;saybye();&nbsp;&nbsp;</span></li><li><span>&#125;);&nbsp;&nbsp;</span></li></ol></div><p><span style="color: rgb(51, 51, 51); font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">输出</span></p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>&gt;&nbsp;</span><span class="string">&quot;hello&quot;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&gt;&nbsp;<span class="string">&quot;world&quot;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&gt;&nbsp;<span class="string">&quot;bye&quot;</span><span>&nbsp;&nbsp;</span></span></li></ol></div><p>&nbsp;</p>
]]>
</description>
</item><item>
<link>http://liuxinxiu.com:80/generator_co/</link>
<title><![CDATA[搞定 koa 之generator 与 co]]></title> 
<author>刘新修 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[NodeJs平台]]></category>
<pubDate>Wed, 17 May 2017 09:29:07 +0000</pubDate> 
<guid>http://liuxinxiu.com:80/generator_co/</guid> 
<description>
<![CDATA[ 
	<p>&nbsp;<span style="color: rgb(51, 51, 51); font-family: &quot;Helvetica Neue&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, Tahoma, &quot;Hiragino Sans GB&quot;, STHeiti, sans-serif; font-size: 15px; white-space: pre-wrap;">koa 是由 tj大神利用 generator 开发的 web 框架。要理解 koa，首先要先了解 generator 与 co。作为搞定 koa 的第一篇，我们便谈谈这个。文章首发在</span><a href="http://boke.io/" target="_blank" style="color: rgb(0, 136, 204); text-decoration: none; font-family: &quot;Helvetica Neue&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, Tahoma, &quot;Hiragino Sans GB&quot;, STHeiti, sans-serif; font-size: 15px; white-space: pre-wrap;">boke.io</a></p><p>generator介绍</p><p>&nbsp;function* Gene()&#123;</p><p>&nbsp; &nbsp; yield 1;</p><p>&nbsp; &nbsp; yield 2;</p><p>&#125;</p><p>var gene = Gene();</p><p>console.log(gene.next());//&#123; value: 1, done: false &#125;</p><p>console.log(gene.next());//&#123; value: 2, done: false &#125;</p><p>console.log(gene.next());//&#123; value: undefined, done: true &#125;</p><p>console.log(gene.next());//Error: Generator has already finished &nbsp;经@Ralph-Wang提醒从 v0.11.13 开始不抛错了，返回&#123; value: undefined, done: true &#125;</p><p>从上面我们可以看到</p><p>generator 的定义和函数类似，只是在 function 后面多了一个*</p><p>调用generator 和调用函数一样，只是不像函数立即执行，而是会生成一个对象</p><p>generator 生成的对象存在一个 next 函数，调用 next 会返回 yield运算的结果对象，并停止。再次调用会在下一个 yield 处停止。</p><p>当所有的 yield 被执行完，调用 next 函数会返回&#123; value: undefined, done: true &#125;。再次调用会报错</p><p>generator 与异步</p><p>&nbsp;看完 generator 的介绍，你心里回想这跟异步有毛关系？不着急听我接着说</p><p>串行请求两个网页的代码</p><p>var request = require('request');</p><p>var a = &#123;&#125;;</p><p>var b = &#123;&#125;;</p><p>request('http://www.google.com', function (error, response, body) &#123;</p><p>&nbsp; &nbsp; if (!error &amp;&amp; response.statusCode == 200) &#123;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; a.response = response;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; a.body = body;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; request('http://www.yahoo.com', function (error, response, body) &#123;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!error &amp;&amp; response.statusCode == 200) &#123;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b.response = response;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b.body = body;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &#125;);</p><p>&nbsp; &nbsp; &#125;</p><p>&#125;);</p><p>我们再看看最终我们是如何利用 generator请求网页的</p><p>co(function *()&#123;</p><p>&nbsp; var a = yield request('http://google.com');</p><p>&nbsp; var b = yield request('http://yahoo.com');</p><p>&nbsp; console.log(a[0].statusCode);</p><p>&nbsp; console.log(b[0].statusCode);</p><p>&#125;)()</p><p>上面的代码可以看到，co 里面传入了一个 generator，里面用 yield 调用异步函数。从逻辑上看，里面的异步被变成了同步。</p><p>co 到底有什么魔法？可以把我们从异步中解救出来？</p><p>想想 generator 的特性，当我们执行第一个 next 的时候，会调用第一个 request，此时我们去调用 request 的逻辑，然后把 generator 的实例穿进去。当第一个 request 逻辑完成时，在调用这个 generator 的 next，这样就到了第二个 yield 的逻辑了。当然这需要一些逻辑的封装，也就是 co 了。</p><p>根据上面的分析，我们大概可以写出下面的代码</p><p>function co(Gene)&#123;</p><p>&nbsp; &nbsp; //先实例化一下</p><p>&nbsp; &nbsp; var gene = Gene();</p><p>&nbsp; &nbsp; //如果存在 next 函数</p><p>&nbsp; &nbsp; if(gene.next)&#123;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; var fun = gene.next();//把异步函数返回过来，好继续封装</p><p>&nbsp; &nbsp; &nbsp; &nbsp; //fun 处理完，再调用 gene.next()</p><p>&nbsp; &nbsp; &nbsp; &nbsp; //...</p><p>&nbsp; &nbsp; &#125;</p><p>&#125;</p><p>从上面的代码可以看出</p><p>yield 后面的内容需要返回一个异步函数，这样我们才可进一步封装异步处理的逻辑。</p><p>fun 需要可以传入参数，这样才可以处理多个异步</p><p>需要一个递归调用，这样才可以持续调用 next，同时根据 next 返回对象中的done属性停止逻辑</p><p>需要考虑错误处理</p><p>&nbsp;今天就到这里，下一篇详细讲一下 co 的源码</p>
]]>
</description>
</item><item>
<link>http://liuxinxiu.com:80/s/278/</link>
<title><![CDATA[co最简版实现，学习generator amp; co]]></title> 
<author>刘新修 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[NodeJs平台]]></category>
<pubDate>Wed, 17 May 2017 09:25:46 +0000</pubDate> 
<guid>http://liuxinxiu.com:80/s/278/</guid> 
<description>
<![CDATA[ 
	<p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">看了co的源码 比较难懂 了解了其原理后实现了一个最简版本https://github.com/yucong/simple-co 希望对想学习的tx有帮助～ yeild后面只支持thunk，co本身也是一个thunk</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">核心代码：</span></font><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;"><br /></span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">function co(generator) &#123;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">&nbsp;&nbsp;return function(fn) &#123;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px;"><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span>var gen = generator();</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px;"><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span>function next(err, result) &#123;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px;"><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span>if(err)&#123;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px;"><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>return fn(err);</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px;"><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span>&#125;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px;"><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span>var step = gen.next(result);</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px;"><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span>if (!step.done) &#123;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px;"><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>step.value(next);</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px;"><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span>&#125; else &#123;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px;"><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>fn(null, step.value);</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px;"><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span>&#125;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px;"><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span>&#125;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px;"><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span>next();</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">&nbsp;&nbsp; &#125;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">&#125;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">用法：</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;"><br /></span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">var co = require('./co');</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">// wrap the function to thunk</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">function readFile(filename) &#123;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">&nbsp;&nbsp;&nbsp;&nbsp;return function(callback) &#123;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px;"><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp;require('fs').readFile(filename, 'utf8', callback);</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">&nbsp;&nbsp;&nbsp;&nbsp;&#125;;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">&#125;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;"><br /></span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">co(function * () &#123;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">&nbsp;&nbsp;&nbsp;&nbsp;var file1 = yield readFile('./file/a.txt');</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">&nbsp;&nbsp;&nbsp;&nbsp;var file2 = yield readFile('./file/b.txt');</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;"><br /></span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">&nbsp;&nbsp;&nbsp;&nbsp;console.log(file1);</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">&nbsp;&nbsp;&nbsp;&nbsp;console.log(file2);</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">&nbsp;&nbsp;&nbsp;&nbsp;return 'done';</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">&#125;)(function(err, result) &#123;</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">&nbsp;&nbsp;&nbsp;&nbsp;console.log(result)</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">&#125;);</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">会打印出：</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">content in a.txt</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">content in b.txt</span></font></p><p><font color="#333333" face="Helvetica Neue, Luxi Sans, DejaVu Sans, Tahoma, Hiragino Sans GB, STHeiti, sans-serif"><span style="font-size: 15px; white-space: pre-wrap;">done</span></font></p><p>================================</p><p><strong>generator_co: &nbsp;</strong><a href="http://liuxinxiu.com/generator_co/"><strong>http://liuxinxiu.com/generator_co/</strong></a></p>
]]>
</description>
</item><item>
<link>http://liuxinxiu.com:80/node_Cannot_find_module/</link>
<title><![CDATA[Node.js Cannot find module xxx 问题解决(MAC)]]></title> 
<author>刘新修 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[NodeJs平台]]></category>
<pubDate>Sun, 26 Mar 2017 10:34:40 +0000</pubDate> 
<guid>http://liuxinxiu.com:80/node_Cannot_find_module/</guid> 
<description>
<![CDATA[ 
	<p><span style="color: rgb(54, 46, 43); font-family: Arial;">使用npm install -g 'xxx' 之后仍然报 </span><br style="color: rgb(54, 46, 43); font-family: Arial;" /><span style="color: rgb(54, 46, 43); font-family: Arial;">Cannot find module 'xxx' 错误，可以通过设置环境变量来解决； </span><br style="color: rgb(54, 46, 43); font-family: Arial;" /><br style="color: rgb(54, 46, 43); font-family: Arial;" /><span style="color: rgb(54, 46, 43); font-family: Arial;">export NODE_PATH=/usr/local/lib/node_modules/&nbsp;&nbsp;</span><br style="color: rgb(54, 46, 43); font-family: Arial;" /><span style="color: rgb(54, 46, 43); font-family: Arial;">echo $NODE_PATH&nbsp;&nbsp;</span></p><p><style type="text/css">p.p1 &#123;margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px 'Andale Mono'; color: #28fe14; background-color: #000000; background-color: rgba(0, 0, 0, 0.9)&#125;span.s1 &#123;font-variant-ligatures: no-common-ligatures&#125;</style></p><p class="p1"><span class="s1">Error: Cannot find module 'ftp'</span></p><p><a href="http://at.liuxinxiu.com/2017/03/image/yy.gif" target="_blank"><img src="http://at.liuxinxiu.com/2017/03/image/yy.gif" width="650" height="443" alt="" /></a></p>
]]>
</description>
</item><item>
<link>http://liuxinxiu.com:80/V8/</link>
<title><![CDATA[使用 Google V8 引擎开发可定制的应用程序]]></title> 
<author>刘新修 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[NodeJs平台]]></category>
<pubDate>Thu, 02 Mar 2017 02:20:49 +0000</pubDate> 
<guid>http://liuxinxiu.com:80/V8/</guid> 
<description>
<![CDATA[ 
	<p>&nbsp;V8 引擎概览</p><div>&nbsp;</div><div>Google V8 引擎使用 C++ 代码编写，实现了 ECMAScript 规范的第五版，可以运行在所有的主流</div><div>&nbsp;</div><div>操作系统中，甚至可以运行在移动终端 ( 基于 ARM 的处理器，如 HTC G7 等 )。V8 最早被开发用以嵌入到 Google 的开源浏览器 Chrome 中，但是 V8 是一个可以独立的模块，完全可以嵌入您自己的应用，著名的 Node.js( 一个异步的服务器框架，可以在服务端使用 JavaScript 写出搞笑的网络服务器 ) 就是基于 V8 引擎的。</div><div>&nbsp;</div><div>和其他 JavaScript 引擎一样，V8 会编译 / 执行 JavaScript 代码，管理内存，负责垃圾回收，与宿主语言的交互等。V8 的垃圾回收器采用了众多技术，使得其运行效率大大提高。通过暴露宿主对象 ( 变量，函数等 ) 到 JavaScript，JavaScript 可以访问宿主环境中的对象，并在脚本中完成对宿主对象的操作。</div><div>&nbsp;</div><div>V8 引擎基本概念</div><div>&nbsp;</div><div>图 1. V8 引擎基本概念关系图 ( 根据 Google V8 官方文档 )&nbsp;</div><div><a href="http://at.liuxinxiu.com/2017/03/image/001.jpg" target="_blank"><img src="http://at.liuxinxiu.com/2017/03/image/001.jpg" width="425" height="267" alt="" /></a></div><div><div>handle</div><div>&nbsp;</div><div>handle 是指向对象的指针，在 V8 中，所有的对象都通过 handle 来引用，handle 主要用于 V8 的垃圾回收机制。</div><div>&nbsp;</div><div>在 V8 中，handle 分为两种：持久化 (Persistent)handle 和本地 (Local)handle，持久化 handle 存放在堆上，而本地 handle 存放在栈上。这个与 C/C++ 中的堆和栈的意义相同 ( 简而言之，堆上的空间需要开发人员自己申请，使用完成之后显式的释放；而栈上的为自动变量，在退出函数 / 方法之后自动被释放 )。持久化 handle 与本地 handle 都是 Handle 的子类。在 V8 中，所有数据访问均需要通过 handle。需要注意的是，使用持久化 handle 之后，需要显式的调用 Dispose() 来通知垃圾回收机制。</div><div>&nbsp;</div><div>作用域 (scope)</div><div>&nbsp;</div><div>scope 是 handle 的集合，可以包含若干个 handle，这样就无需将每个 handle 逐次释放，而是直接释放整个 scope。</div><div>&nbsp;</div><div>在使用本地 handle 时，需要声明一个 HandleScope 的实例，scope 是 handle 的容器，使用 scope，则无需依次释放 handle。</div><div>&nbsp;</div><div>&nbsp;HandleScope handle_scope;&nbsp;</div><div>&nbsp;Local&lt;ObjectTemplate&gt; temp;&nbsp;</div><div>&nbsp;</div><div>上下文 (context)</div><div>&nbsp;</div><div>context 是一个执行器环境，使用 context 可以将相互分离的 JavaScript 脚本在同一个 V8 实例中运行，而互不干涉。在运行 JavaScript 脚本是，需要显式的指定 context 对象。</div><div>&nbsp;</div><div>数据及模板</div><div>&nbsp;</div><div>由于 C++ 原生数据类型与 JavaScript 中数据类型有很大差异，因此 V8 提供了 Data 类，从 JavaScript 到 C++，从 C++ 到 JavaScrpt 都会用到这个类及其子类，比如：</div><div>&nbsp;</div><div>&nbsp;Handle&lt;Value&gt; Add(const Arguments&amp; args)&#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> int a = args[0]-&gt;Uint32Value();&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> int b = args[1]-&gt;Uint32Value();&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> return Integer::New(a+b);&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>Integer 即为 Data 的一个子类。</div><div>&nbsp;</div><div>V8 中，有两个模板 (Template) 类 ( 并非 C++ 中的模板类 )：对象模板 (ObjectTempalte) 和函数模板 (FunctionTemplate)，这两个模板类用以定义 JavaScript 对象和 JavaScript 函数。我们在后续的小节部分将会接触到模板类的实例。通过使用 ObjectTemplate，可以将 C++ 中的对象暴露给脚本环境，类似的，FunctionTemplate 用以将 C++ 函数暴露给脚本环境，以供脚本使用。</div><div>&nbsp;</div><div>初始化 context 是使用 V8 引擎所必需的过程，代码非常简单：</div><div>&nbsp;</div><div>&nbsp;Persistent&lt;Context&gt; context = Context::New();&nbsp;</div><div>V8 引擎使用示例</div><div>&nbsp;</div><div>有了上面所述的基本概念之后，我们来看一下一个使用 V8 引擎的应用程序的基本流程：</div><div>&nbsp;</div><div>创建 HandleScope 实例</div><div>创建一个持久化的 Context</div><div>进入 Context</div><div>创建脚本字符串</div><div>创建 Script 对象，通过 Script::Compile()</div><div>执行脚本对象的 Run 方法</div><div>获取 / 处理结果</div><div>显式的调用 Context 的 Dispose 方法</div><div>基本代码模板</div><div>&nbsp;</div><div>&nbsp;</div><div>清单 1. 代码模块&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div>&nbsp;#include &lt;v8.h&gt;&nbsp;</div><div>&nbsp;</div><div>&nbsp;using namespace v8;&nbsp;</div><div>&nbsp;</div><div>&nbsp;int main(int argc, char *argv[]) &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> // 创建一个句柄作用域 ( 在栈上 )&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> HandleScope handle_scope;&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> // 创建一个新的上下文对象</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Persistent&lt;Context&gt; context = Context::New();&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> // 进入上一步创建的上下文，用于编译执行 helloworld&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Context::Scope context_scope(context);&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> // 创建一个字符串对象，值为'Hello, Wrold!', 字符串对象被 JS 引擎</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> // 求值后，结果为'Hello, World!'</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Handle&lt;String&gt; source = String::New(&quot;'Hello' + ', World!'&quot;);&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> // 编译字符串对象为脚本对象</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Handle&lt;Script&gt; script = Script::Compile(source);&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> // 执行脚本，获取结果</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Handle &lt;Value&gt; result = script-&gt;Run();&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> // 释放上下文资源</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> context.Dispose();&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> // 转换结果为字符串</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> String::AsciiValue ascii(result);&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> printf(&quot;%s&#92;n&quot;, *ascii);&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> return 0;&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>以上代码为一个使用 V8 引擎来运行脚本的基本模板，可以看到，开发人员可以很容易的在自己的代码中嵌入 V8 来处理 JavaScript 脚本。我们在下面小节中详细讨论如何在脚本中访问 C++ 资源。</div><div>&nbsp;</div><div>使用 C++ 变量</div><div>&nbsp;</div><div>在 JavaScript 与 V8 间共享变量事实上是非常容易的，基本模板如下：</div><div>&nbsp;</div><div>&nbsp;</div><div>清单 2. 共享变量&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div>&nbsp;static type xxx;&nbsp;</div><div>&nbsp;</div><div>&nbsp;static Handle&lt;Value&gt; xxxGetter(&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Local&lt;String&gt; name,&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> const AccessorInfo&amp; info)&#123;&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> //code about get xxx&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>&nbsp;static void xxxSetter(&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Local&lt;String&gt; name,&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Local&lt;Value&gt; value,&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> const AccessorInfo&amp; info)&#123;&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> //code about set xxx&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>首先在 C++ 中定义数据，并以约定的方式定义 getter/setter 函数，然后需要将 getter/setter 通过下列机制公开给脚本：</div><div>&nbsp;</div><div>&nbsp;global-&gt;SetAccessor(String::New(&quot;xxx&quot;), xxxGetter, xxxSetter);&nbsp;</div><div>&nbsp;</div><div>其中，global 对象为一个全局对象的模板：</div><div>&nbsp;</div><div>&nbsp;Handle&lt;ObjectTemplate&gt; global = ObjectTemplate::New();&nbsp;</div><div>&nbsp;</div><div>下面我们来看一个实例：</div><div>&nbsp;</div><div>&nbsp;</div><div>清单 3. 实例 1&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div>&nbsp;static char sname[512] = &#123;0&#125;;&nbsp;</div><div>&nbsp;</div><div>&nbsp;static Handle&lt;Value&gt; NameGetter(Local&lt;String&gt; name,&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> const AccessorInfo&amp; info) &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> return String::New((char*)&amp;sname,strlen((char*)&amp;sname));&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>&nbsp;static void NameSetter(Local&lt;String&gt; name,&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> Local&lt;Value&gt; value,&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> const AccessorInfo&amp; info) &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Local&lt;String&gt; str = value-&gt;ToString();&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> str-&gt;WriteAscii((char*)&amp;sname);&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>定义了 NameGetter, NameSetter 之后，在 main 函数中，将其注册在 global 上：</div><div>&nbsp;</div><div>&nbsp;// Create a template for the global object.&nbsp;</div><div>&nbsp;Handle&lt;ObjectTemplate&gt; global = ObjectTemplate::New();&nbsp;</div><div>&nbsp;</div><div>&nbsp;//public the name variable to script&nbsp;</div><div>&nbsp;global-&gt;SetAccessor(String::New(&quot;name&quot;), NameGetter, NameSetter);&nbsp;</div><div>&nbsp;</div><div>在 C++ 中，将 sname 的值设置为&rdquo;cpp&rdquo;：</div><div>&nbsp;</div><div>&nbsp;//set sname to &quot;cpp&quot; in cpp program&nbsp;</div><div>&nbsp;strncpy(sname, &quot;cpp&quot;, sizeof(sname));&nbsp;</div><div>&nbsp;</div><div>然后在 JavaScript 中访问该变量，并修改：</div><div>&nbsp;</div><div>&nbsp;print(name);&nbsp;</div><div>&nbsp;</div><div>&nbsp;//set the variable `name` to &quot;js&quot;</div><div>&nbsp;name='js';&nbsp;</div><div>&nbsp;print(name);&nbsp;</div><div>&nbsp;</div><div>运行结果如下：</div><div>&nbsp;</div><div>&nbsp;cpp&nbsp;</div><div>&nbsp;js&nbsp;</div><div>&nbsp;</div><div>运行脚本，第一个 print 调用会打印在 C++ 代码中设置的 name 变量的值：cpp，然后我们在脚本中修改 name 值为：js，再次调用 print 函数则打印出设置后的值：js。</div><div>&nbsp;</div><div>调用 C++ 函数</div><div>&nbsp;</div><div>在 JavaScript 中调用 C++ 函数是脚本化最常见的方式，通过使用 C++ 函数，可以极大程度的增强 JavaScript 脚本的能力，如文件读写，网络 / 数据库访问，图形 / 图像处理等等，而在 V8 中，调用 C++ 函数也非常的方便。</div><div>&nbsp;</div><div>在 C++ 代码中，定义以下原型的函数：</div><div>&nbsp;</div><div>&nbsp;Handle&lt;Value&gt; function(constArguments&amp; args)&#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> //return something&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>然后，再将其公开给脚本：</div><div>&nbsp;</div><div>&nbsp;global-&gt;Set(String::New(&quot;function&quot;),FunctionTemplate::New(function));&nbsp;</div><div>&nbsp;</div><div>同样，我们来看两个示例：</div><div>&nbsp;</div><div>&nbsp;</div><div>清单 4. 实例 2&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div>&nbsp;Handle&lt;Value&gt; Add(const Arguments&amp; args)&#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> int a = args[0]-&gt;Uint32Value();&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> int b = args[1]-&gt;Uint32Value();&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> return Integer::New(a+b);&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>&nbsp;Handle&lt;Value&gt; Print(const Arguments&amp; args) &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> bool first = true;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> for (int i = 0; i &lt; args.Length(); i++) &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> HandleScope handle_scope;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> if (first) &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> first = false;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> &#125; else &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> printf(&quot; &quot;);&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> &#125;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> String::Utf8Value str(args[i]);&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> const char* cstr = ToCString(str);&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> printf(&quot;%s&quot;, cstr);&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> &#125;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> printf(&quot;&#92;n&quot;);&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> fflush(stdout);&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> return Undefined();&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>函数 Add 将两个参数相加，并返回和。函数 Print 接受任意多个参数，然后将参数转换为字符串输出，最后输出换行。</div><div>&nbsp;</div><div>&nbsp;global-&gt;Set(String::New(&quot;print&quot;), FunctionTemplate::New(Print));&nbsp;</div><div>&nbsp;global-&gt;Set(String::New(&quot;add&quot;), FunctionTemplate::New(Add));&nbsp;</div><div>&nbsp;</div><div>我们定义以下脚本：</div><div>&nbsp;</div><div>&nbsp;var x = (function(a, b)&#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> return a + b; <span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span></div><div>&nbsp;&#125;)(12, 7);&nbsp;</div><div>&nbsp;</div><div>&nbsp;print(x);&nbsp;</div><div>&nbsp;</div><div>&nbsp;//invoke function add defined in cpp&nbsp;</div><div>&nbsp;var y = add(43, 9);&nbsp;</div><div>&nbsp;print(y);&nbsp;</div><div>&nbsp;</div><div>运行结果如下：</div><div>&nbsp;</div><div>&nbsp;19&nbsp;</div><div>&nbsp;52&nbsp;</div><div>&nbsp;</div><div>使用 C++ 类</div><div>&nbsp;</div><div>如果从面向对象的视角来分析，最合理的方式是将 C++ 类公开给 JavaScript，这样可以将 JavaScript 内置的对象数量大大增加，从而尽可能少的使用宿主语言，而更大的利用动态语言的灵活性和扩展性。事实上，C++ 语言概念众多，内容繁复，学习曲线较 JavaScript 远为陡峭。最好的应用场景是：既有脚本语言的灵活性，又有 C/C++ 等系统语言的效率。使用 V8 引擎，可以很方便的将 C++ 类&rdquo;包装&rdquo;成可供 JavaScript 使用的资源。</div><div>&nbsp;</div><div>我们这里举一个较为简单的例子，定义一个 Person 类，然后将这个类包装并暴露给 JavaScript 脚本，在脚本中新建 Person 类的对象，使用 Person 对象的方法。</div><div>&nbsp;</div><div>首先，我们在 C++ 中定义好类 Person：</div><div>&nbsp;</div><div>&nbsp;</div><div>清单 5. 定义类&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div>&nbsp;class Person &#123;&nbsp;</div><div>&nbsp;private:&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> unsigned int age;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> char name[512];&nbsp;</div><div>&nbsp;</div><div>&nbsp;public:&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Person(unsigned int age, char *name) &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> this-&gt;age = age;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> strncpy(this-&gt;name, name, sizeof(this-&gt;name));&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> &#125;&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> unsigned int getAge() &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> return this-&gt;age;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> &#125;&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> void setAge(unsigned int nage) &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> this-&gt;age = nage;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> &#125;&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> char *getName() &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> return this-&gt;name;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> &#125;&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> void setName(char *nname) &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> strncpy(this-&gt;name, nname, sizeof(this-&gt;name));&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> &#125;&nbsp;</div><div>&nbsp;&#125;;&nbsp;</div><div>&nbsp;</div><div>Person 类的结构很简单，只包含两个字段 age 和 name，并定义了各自的 getter/setter. 然后我们来定义构造器的包装：</div><div>&nbsp;</div><div>&nbsp;Handle&lt;Value&gt; PersonConstructor(const Arguments&amp; args)&#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Handle&lt;Object&gt; object = args.This();&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> HandleScope handle_scope;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> int age = args[0]-&gt;Uint32Value();&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> String::Utf8Value str(args[1]);&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> char* name = ToCString(str);&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Person *person = new Person(age, name);&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> object-&gt;SetInternalField(0, External::New(person));&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> return object;&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>从函数原型上可以看出，构造器的包装与上一小节中，函数的包装是一致的，因为构造函数在 V8 看来，也是一个函数。需要注意的是，从 args 中获取参数并转换为合适的类型之后，我们根据此参数来调用 Person 类实际的构造函数，并将其设置在 object 的内部字段中。紧接着，我们需要包装 Person 类的 getter/setter：</div><div>&nbsp;</div><div>&nbsp;Handle&lt;Value&gt; PersonGetAge(const Arguments&amp; args)&#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Local&lt;Object&gt; self = args.Holder();&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Local&lt;External&gt; wrap = Local&lt;External&gt;::Cast(self-&gt;GetInternalField(0));&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> void *ptr = wrap-&gt;Value();&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> return Integer::New(static_cast&lt;Person*&gt;(ptr)-&gt;getAge());&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>&nbsp;Handle&lt;Value&gt; PersonSetAge(const Arguments&amp; args)&nbsp;</div><div>&nbsp;&#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Local&lt;Object&gt; self = args.Holder();&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Local&lt;External&gt; wrap = Local&lt;External&gt;::Cast(self-&gt;GetInternalField(0));&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> void* ptr = wrap-&gt;Value();&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> static_cast&lt;Person*&gt;(ptr)-&gt;setAge(args[0]-&gt;Uint32Value());&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> return Undefined();&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>而 getName 和 setName 的与上例类似。在对函数包装完成之后，需要将 Person 类暴露给脚本环境：</div><div>&nbsp;</div><div>首先，创建一个新的函数模板，将其与字符串&rdquo;Person&rdquo;绑定，并放入 global：</div><div>&nbsp;</div><div>&nbsp;Handle&lt;FunctionTemplate&gt; person_template = FunctionTemplate::New(PersonConstructor);&nbsp;</div><div>&nbsp;person_template-&gt;SetClassName(String::New(&quot;Person&quot;));&nbsp;</div><div>&nbsp;global-&gt;Set(String::New(&quot;Person&quot;), person_template);&nbsp;</div><div>&nbsp;</div><div>然后定义原型模板：</div><div>&nbsp;</div><div>&nbsp;Handle&lt;ObjectTemplate&gt; person_proto = person_template-&gt;PrototypeTemplate();&nbsp;</div><div>&nbsp;</div><div>&nbsp;person_proto-&gt;Set(&quot;getAge&quot;, FunctionTemplate::New(PersonGetAge));&nbsp;</div><div>&nbsp;person_proto-&gt;Set(&quot;setAge&quot;, FunctionTemplate::New(PersonSetAge));&nbsp;</div><div>&nbsp;</div><div>&nbsp;person_proto-&gt;Set(&quot;getName&quot;, FunctionTemplate::New(PersonGetName));&nbsp;</div><div>&nbsp;person_proto-&gt;Set(&quot;setName&quot;, FunctionTemplate::New(PersonSetName));&nbsp;</div><div>&nbsp;</div><div>最后设置实例模板：</div><div>&nbsp;</div><div>&nbsp;Handle&lt;ObjectTemplate&gt; person_inst = person_template-&gt;InstanceTemplate();&nbsp;</div><div>&nbsp;person_inst-&gt;SetInternalFieldCount(1);&nbsp;</div><div>&nbsp;</div><div>随后，创建一个用以测试的脚本：</div><div>&nbsp;</div><div>&nbsp;//global function to print out detail info of person&nbsp;</div><div>&nbsp;function printPerson(person)&#123;&nbsp;</div><div>&nbsp; &nbsp; print(person.getAge()+&quot;:&quot;+person.getName());&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>&nbsp;//new a person object&nbsp;</div><div>&nbsp;var person = new Person(26, &quot;juntao&quot;);&nbsp;</div><div>&nbsp;</div><div>&nbsp;//print it out&nbsp;</div><div>&nbsp;printPerson(person);&nbsp;</div><div>&nbsp;</div><div>&nbsp;//set new value&nbsp;</div><div>&nbsp;person.setAge(28);&nbsp;</div><div>&nbsp;person.setName(&quot;juntao.qiu&quot;);&nbsp;</div><div>&nbsp;</div><div>&nbsp;//print it out&nbsp;</div><div>&nbsp;printPerson(person);&nbsp;</div><div>&nbsp;</div><div>运行得到以下结果：</div><div>&nbsp;</div><div>&nbsp;26:juntao&nbsp;</div><div>&nbsp;28:juntao.qiu&nbsp;</div><div>简单示例</div><div>&nbsp;</div><div>在这一小节中，我们将编写一个简单的桌面计算器：表达式求值部分通过 V8 引擎来进行，而流程控制部分则放在 C++ 代码中，这样可以将表达式解析等复杂细节绕开。同时，我们还得到了一个额外的好处，用户在脚本中可以自定义函数，从而可以在计算器中定义自己的运算规则。</div><div>&nbsp;</div><div>桌上计算器</div><div>&nbsp;</div><div>计算器程序首先进入一个 MainLoop，从标准输入读取一行命令，然后调用 V8 引擎去求值，然后将结果打印到控制台，然后再进入循环：</div><div>&nbsp;</div><div>&nbsp;</div><div>清单 6. 桌面计算器示例&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div>&nbsp;void MainLoop(Handle&lt;Context&gt; context) &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> while(true) &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> char buffer[1024] = &#123;0&#125;;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> printf(&quot;$ &quot;);&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> char *str = fgets(buffer, sizeof(buffer), stdin);&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> if(str == NULL) &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> break;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> &#125;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> HandleScope handle_scope;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> ExecuteString(String::New(str), String::New(&quot;calc&quot;), true);&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> &#125;&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>在 main 函数中设置全局对象，创建上下文对象，并进入 MainLoop：</div><div>&nbsp;</div><div>&nbsp;int main(int argc, char *argv[])&#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> HandleScope handle_scope;&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> // Create a template for the global object.&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Handle&lt;ObjectTemplate&gt; global = ObjectTemplate::New();&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> // Expose the local functions to script&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> global-&gt;Set(String::New(&quot;load&quot;), FunctionTemplate::New(Load));&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> global-&gt;Set(String::New(&quot;print&quot;), FunctionTemplate::New(Print));&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> global-&gt;Set(String::New(&quot;quit&quot;), FunctionTemplate::New(Quit));&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> // Create a new execution environment containing the built-in&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> // functions&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Handle&lt;Context&gt; context = Context::New(NULL, global);&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> // Enter the newly created execution environment.&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Context::Scope context_scope(context);&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> // Enter main loop&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> MainLoop(context);&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> V8::Dispose();&nbsp;</div><div>&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> return 0;&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>在 main 函数中，为脚本提供了三个函数，load 函数用以将用户指定的脚本加载进来，并放入全局的上下文中一边引用，print 函数用以打印结果，而 quit 提供用户退出计算器的功能。</div><div>&nbsp;</div><div>测试一下：</div><div>&nbsp;</div><div>&nbsp;$ 1+2&nbsp;</div><div>&nbsp;3&nbsp;</div><div>&nbsp;</div><div>&nbsp;$ (10+3)/(9.0-5)&nbsp;</div><div>&nbsp;3.25&nbsp;</div><div>&nbsp;</div><div>&nbsp;$ typeof print&nbsp;</div><div>&nbsp;function&nbsp;</div><div>&nbsp;</div><div>&nbsp;$ typeof non&nbsp;</div><div>&nbsp;undefined&nbsp;</div><div>&nbsp;</div><div>&nbsp;// 自定义函数</div><div>&nbsp;$ function add(a, b)&#123;return a+b;&#125;&nbsp;</div><div>&nbsp;$ add(999, 2323)&nbsp;</div><div>&nbsp;3322&nbsp;</div><div>&nbsp;</div><div>&nbsp;// 查看 print 标识符的内容</div><div>&nbsp;$ print&nbsp;</div><div>&nbsp;function print() &#123; [native code] &#125;&nbsp;</div><div>&nbsp;</div><div>load 函数提供了用户自定义函数的功能，将脚本文件作为一个字符串加载到内存，然后对该字符串编译，求值，并将处理过的脚本对象放入当前 context 中，以便用户使用。</div><div>&nbsp;</div><div>&nbsp;Handle&lt;Value&gt; Load(const Arguments&amp; args)&#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> if(args.Length() != 1)&#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> return Undefined();&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> &#125;&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> HandleScope handle_scope;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> String::Utf8Value file(args[0]);&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Handle&lt;String&gt; source = ReadFile(*file);&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> ExecuteString(source, String::New(*file), false);&nbsp;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> return Undefined();&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>而 ExecuteString 函数，负责将字符串编译运行：</div><div>&nbsp;</div><div>&nbsp;bool ExecuteString(Handle&lt;String&gt; source,&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> &nbsp; Handle&lt;Value&gt; name,&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> &nbsp; bool print_result)&nbsp;</div><div>&nbsp;&#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> HandleScope handle_scope;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> TryCatch try_catch;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> Handle&lt;Script&gt; script = Script::Compile(source, name);&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> if (script.IsEmpty()) &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> return false;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> &#125; else &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> Handle&lt;Value&gt; result = script-&gt;Run();&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> if (result.IsEmpty()) &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> return false;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> &#125; else &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> if (print_result &amp;&amp; !result-&gt;IsUndefined()) &#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> String::Utf8Value str(result);&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> const char* cstr = ToCString(str);&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> printf(&quot;%s&#92;n&quot;, cstr);&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> &#125;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> return true;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> &#125;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> &#125;&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>将下列内容存入一个文本文件，并命令为 calc.js：</div><div>&nbsp;</div><div>&nbsp;function sum()&#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> var s = 0;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> for(var i = 0; i &lt; arguments.length; i++)&#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> s += arguments[i];&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> &#125;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> return s;&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>&nbsp;function avg()&#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> var args = arguments;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> var count = args.length;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> var sum = 0;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> for(var i = 0; i &lt; count; i++)&#123;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;&nbsp;&nbsp;</span> sum += args[i];&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> &#125;&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">&nbsp;&nbsp;</span> return sum/count;&nbsp;</div><div>&nbsp;&#125;&nbsp;</div><div>&nbsp;</div><div>然后在计算器中测试：</div><div>&nbsp;</div><div>&nbsp;// 此时 sum 符号位定义</div><div>&nbsp;$ typeof sum&nbsp;</div><div>&nbsp;undefined&nbsp;</div><div>&nbsp;</div><div>&nbsp;// 加载文件，并求值</div><div>&nbsp;$ load(&quot;calc.js&quot;)&nbsp;</div><div>&nbsp;</div><div>&nbsp;// 可以看到，sum 的类型为函数</div><div>&nbsp;$ typeof sum&nbsp;</div><div>&nbsp;function&nbsp;</div><div>&nbsp;</div><div>&nbsp;$ sum(1,2,3,4,5,6,7,8,9)&nbsp;</div><div>&nbsp;45&nbsp;</div><div>结束语</div><div>&nbsp;</div><div>使用 V8 引擎，可以轻松的将脚本的好处带进 C++ 应用，使得 C++ 应用更具灵活性，扩展性。我们在文中讨论了基本的模板，如何使用 C++ 变量，函数，以及类。最后的实例中给出了一个计算器的原型。由于 V8 的设计原则，开发人员可以快速的将其嵌入到自己的应用中，并且无需太过担心脚本语言的执行效率。</div></div>
]]>
</description>
</item><item>
<link>http://liuxinxiu.com:80/CORS_Node_Proxy/</link>
<title><![CDATA[NodeJS反向代理至后端数据接口]]></title> 
<author>刘新修 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[NodeJs平台]]></category>
<pubDate>Wed, 21 Sep 2016 04:36:38 +0000</pubDate> 
<guid>http://liuxinxiu.com:80/CORS_Node_Proxy/</guid> 
<description>
<![CDATA[ 
	<p><span style="color: rgb(255, 0, 0);">支持来自任何域名的Post请求，验证请求参数必须有: [name、gender] 否则直接JSON返回错误！</span></p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">var</span><span> http=require(</span><span class="string">'http'</span><span>);&nbsp;&nbsp;</span></span></li><li><span><span class="keyword">function</span><span> server()&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.exec=</span><span class="keyword">function</span><span>(route,req,res)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> _self=</span><span class="keyword">this</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********** 获取客户端数组中的部分数据可向后多取 **********/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.arrv=</span><span class="keyword">function</span><span>(o,n,p)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">var</span><span> i,y,d,p;y=</span><span class="keyword">false</span><span>;d=</span><span class="string">''</span><span>;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">for</span><span>(i </span><span class="keyword">in</span><span> o)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">if</span><span>(o[i]==n&amp;&amp;p==undefined)&#123;i++;</span><span class="keyword">return</span><span> o[i]&#125;;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">if</span><span>(o[i]==n&amp;&amp;p!=undefined&amp;&amp;!isNaN(p)&#124;&#124;y)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">var</span><span> s;s=i;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p=Number(p);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">if</span><span>(p&gt;0)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p--;s++;d+=o[s];y=<span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">else</span><span>&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span> d;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********** 请求后端时可获取单个header头内地信息 **********/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.getReqHeaders=</span><span class="keyword">function</span><span>(n)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="keyword">typeof</span><span>(n)==</span><span class="string">'undefined'</span><span>)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">'getReqHeaders(n)变量没有定义!'</span><span>);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<span class="keyword">else</span><span>&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span> _self.arrv(req.rawHeaders,String(n));&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/******** 获取客户端请求的header整体头部信息 ********/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.rawHeaders=</span><span class="keyword">function</span><span>(state)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> json=&#123;&#125;;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(!state)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">var</span><span> i=0;i&lt;req.rawHeaders.length;i++)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> s,s=i;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(i%2==0)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s++;json[req.rawHeaders[i]]=req.rawHeaders[s];&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(state)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">var</span><span> i=0;i&lt;req.rawHeaders.length;i++)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json[i]=req.rawHeaders[i];&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> jsonStr=JSON.stringify(json);</span><span class="comment">//结果：&quot;&#123;'1':'a','2':'b','3':'c'&#125;&quot;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> jsonObj=JSON.parse(jsonStr); </span><span class="comment">//结果：[object Object]</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span> jsonObj;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//接收参数 ------ sreq.on(&quot;data&quot;,function(data)&#123;&#125;);接收html中ajax传递的参数</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;req.on(<span class="string">&quot;data&quot;</span><span>,</span><span class="keyword">function</span><span>(data)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********* 打印提示&#124;&#124;接受数据并反向代理到后端 *********/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">&quot;&#92;n---&gt;&gt;&#92;nReq.on('data')&quot;</span><span>,req.method.toUpperCase()+</span><span class="string">&quot; Use Proxy!&quot;</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********* 使用代理&#124;&#124;这里Post请求体是回调data *********/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send(route,req,res,data);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********** 判断是GET请求类型&#124;&#124;也可以代理给后端处理 **********/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(req.method.toUpperCase()==</span><span class="string">&quot;GET&quot;</span><span>)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> params=[];&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//params=url.parse(request.url,true).query;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//params['fruit']=compute(params);</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.writeHeader(200,&#123;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;Content-type&quot;</span><span>:</span><span class="string">&quot;text/html; charset=utf-8&quot;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.write(<span class="string">'&lt;h1&gt;It is forbidden for the URL request!&lt;/h1&gt;'</span><span>);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.write(<span class="string">'&lt;hr&gt;&lt;address&gt;NodeJs/'</span><span>+process.version);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.write(<span class="string">' at '</span><span>+req.headers.host.split(</span><span class="string">':'</span><span>)[0]);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.write(<span class="string">' Port '</span><span>+req.headers.host.split(</span><span class="string">':'</span><span>)[1]+</span><span class="string">'&lt;/address&gt;'</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.end();&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********* 如有req.on(&quot;data&quot;,function(data)&#123;&#125;);就跳过了以下方法 ******/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********* 判断是POST请求类型&#124;&#124;提交不走代理此方法是本机处理回调 **********/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span> </span><span class="keyword">if</span><span>(req.method.toUpperCase()==</span><span class="string">'POSTo'</span><span>)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> postData=</span><span class="string">&quot;&quot;</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********** 读取Post提交的数据 **********/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.addListener(<span class="string">&quot;data&quot;</span><span>,</span><span class="keyword">function</span><span>(data)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;postData+=data;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********** 数据读取完毕就会执行的监听 *********/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.addListener(<span class="string">&quot;end&quot;</span><span>,</span><span class="keyword">function</span><span>()&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">/********* 定义Post请求主体 *********/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">var</span><span> query=require(</span><span class="string">'querystring'</span><span>).parse(postData);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">/************** 判断如果有POST过来数据 *************/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">if</span><span>(query.name&amp;&amp;query.gender)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">'Start a request...'</span><span>);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> origin=_self.arrv(req.rawHeaders,</span><span class="string">'Origin'</span><span>);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">&quot;origin:&quot;</span><span>+</span><span class="keyword">typeof</span><span> req.rawHeaders+</span><span class="string">'---'</span><span>)&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********** 代理转发至php,跨域全放开让后端去匹配验证 **********/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//res.setHeader('Access-Control-Allow-Origin','*');</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//res.setHeader('Access-Control-Allow-Headers','X-Requested-With');</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//res.setHeader('Access-Control-Allow-Methods','GET,POST,PUT,DELETE,OPTIONS');</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//send(route,req,res,query);</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">/****** 判断结束 ******/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/******** 请求后端接口 ********/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span> send(route,req,res,data)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/***************************************</span> </span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var data=&#123;</span> </span></li><li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name:'liuxinxiu',</span> </span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gender:&quot;male&quot;,</span> </span></li><li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time:new Date().getTime()</span> </span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;;</span> </span></li><li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;****************************************/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//data=require('querystring').stringify(data);</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> rawHeaders=_self.rawHeaders();&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********** 判断一个对象是哪中类型的对象 **********/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span> isArray(obj)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span> Object.prototype.toString.call(obj)===</span><span class="string">'[object Array]'</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********* 打印Request Headers **********/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">&quot;&#92;n---&gt;&gt;&#92;nRequest Headers:&quot;</span><span>,req.rawHeaders);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/***** 向后端发送请求基本的设置 *****/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> options=&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;port: 80,&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;host:<span class="string">&quot;code.liuxinxiu.com&quot;</span><span>,&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path:<span class="string">'/php/Post/CORS_PHP.php'</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method: <span class="string">'POST'</span><span>,&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;headers:&#123;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Content-Type'</span><span>:_self.getReqHeaders(</span><span class="string">'Content-Type'</span><span>),&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Content-Length'</span><span>:data.length,&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Origin'</span><span>:_self.getReqHeaders(</span><span class="string">'Origin'</span><span>),&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'User-Agent'</span><span>:_self.getReqHeaders(</span><span class="string">'User-Agent'</span><span>)&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/***** 如果header整体替换就会乱码 *****/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//options.headers=_self.rawHeaders();</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> request=http.request(options,</span><span class="keyword">function</span><span>(result)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">&quot;&#92;n---&gt;&gt;&#92;nstatusCode:&quot;</span><span>,result.statusCode);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">&quot;&#92;n---&gt;&gt;&#92;nResponse Headers:&quot;</span><span>,result.headers);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(result)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">var</span><span> content_type,origin,x_powered_by,server;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">//content_type=origin=x_powered_by=server=undefined;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; content_type=result.headers[<span class="string">'content-type'</span><span>];&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; origin=result.headers[<span class="string">'access-control-allow-origin'</span><span>];&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x_powered_by=result.headers[<span class="string">'x-powered-by'</span><span>];&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server=result.headers[<span class="string">'server'</span><span>];&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">/********** 判断分别加入包含服务器错误页 **********/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">if</span><span>(origin!=undefined&amp;&amp;result.statusCode==200)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.setHeader(<span class="string">'Access-Control-Allow-Origin'</span><span>,origin);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">if</span><span>(content_type!=undefined)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.setHeader(<span class="string">'Content-Type'</span><span>,content_type);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">if</span><span>(x_powered_by!=undefined)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.setHeader(<span class="string">'X-Powered-By'</span><span>,x_powered_by);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">if</span><span>(server!=undefined)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.setHeader(<span class="string">'Server'</span><span>,server);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********** 有异常的请求需要问题定位 **********/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(result.statusCode&lt;200&#124;&#124;result.statusCode&gt;206)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********** 接受数据数据监听 **********/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> _data=</span><span class="string">''</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.on(<span class="string">'data'</span><span>,</span><span class="keyword">function</span><span>(chunk)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_data+=chunk;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********** 结束接受数据监听 *********/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.on(<span class="string">'end'</span><span>,</span><span class="keyword">function</span><span>()&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.log(<span class="string">&quot;&#92;n---&gt;&gt;&#92;nresult:&quot;</span><span>,_data);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res.write(_data);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res.end();&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/******** request逻辑完成 ********/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.on(<span class="string">'error'</span><span>,</span><span class="keyword">function</span><span>(e) &#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">'problem with request: '</span><span> + e.message);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//request.write(data);</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.write(data+<span class="string">&quot;&#92;n&quot;</span><span>);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.end();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;<span class="comment">/****** 内部结束 ******/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li><span>&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>module.exports=<span class="keyword">new</span><span> server();&nbsp;&nbsp;</span></span></li></ol></div><p>NodeJS数据接口(Post请求直接代理至后端PHP): <a href="http://liuxinxiu.com:3000/CORS_Node_Proxy/" target="_blank"><span style="color: rgb(0, 0, 255);"><u><strong>http://liuxinxiu.com:3000/CORS_Node_Proxy/</strong></u></span></a></p><p>PHP数据接口(验证跨域提交白名单外返回错误):&nbsp;&nbsp;<u><strong><a href="http://code.liuxinxiu.com/php/Post/CORS_PHP.php" target="_blank"><span style="color: rgb(0, 0, 255);">http://code.liuxinxiu.com/php/Post/CORS_PHP.php</span></a></strong></u></p><br/>Tags - <a href="http://liuxinxiu.com:80/tags/node/" rel="tag">node</a> , <a href="http://liuxinxiu.com:80/tags/proxy/" rel="tag">proxy</a> , <a href="http://liuxinxiu.com:80/tags/http.request/" rel="tag">http.request</a>
]]>
</description>
</item><item>
<link>http://liuxinxiu.com:80/CORS_Node/</link>
<title><![CDATA[ CORS跨域资源共享NodeJs版本实现]]></title> 
<author>刘新修 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[NodeJs平台]]></category>
<pubDate>Tue, 13 Sep 2016 13:57:45 +0000</pubDate> 
<guid>http://liuxinxiu.com:80/CORS_Node/</guid> 
<description>
<![CDATA[ 
	<p>使用NodeJs实现CORS 跨域资源共享，可传参origin通过限制，代码如下：</p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">var</span><span> http=require(</span><span class="string">'http'</span><span>);&nbsp;&nbsp;</span></span></li><li><span><span class="keyword">var</span><span> origin=require(</span><span class="string">'./origin'</span><span>); </span><span class="comment">//调用白名单列表</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span><span class="keyword">function</span><span> CORS_Node()&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.exec=</span><span class="keyword">function</span><span>(route,req,res)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> _self=</span><span class="keyword">this</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/************** 获取客户端origin的域名 **************/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;origin.req=req;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//白名单设置置请求头</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;origin.yes=origin.listV();&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">//是否在名单&#124;true</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;origin.name=origin.getName();&nbsp;&nbsp;<span class="comment">//客户端ORIGIN</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/******** 先纠正参数，参数正确后匹配白名单 ********/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********** 判断是GET请求类型 **********/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(req.method.toUpperCase()==</span><span class="string">&quot;GET&quot;</span><span>)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> params=[];&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//params=url.parse(request.url,true).query;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//params['fruit']=compute(params);</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.writeHeader(200,&#123;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;Content-type&quot;</span><span>:</span><span class="string">&quot;text/html; charset=utf-8&quot;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.write(<span class="string">'&lt;h1&gt;It is forbidden for the URL request!&lt;/h1&gt;'</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.write(<span class="string">'&lt;hr&gt;&lt;address&gt;NodeJs/'</span><span>+process.version);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.write(<span class="string">' at '</span><span>+req.headers.host.split(</span><span class="string">':'</span><span>)[0]);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.write(<span class="string">' Port '</span><span>+req.headers.host.split(</span><span class="string">':'</span><span>)[1]+</span><span class="string">'&lt;/address&gt;'</span><span>);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.end();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********* 判断是POST请求类型 **********/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span> </span><span class="keyword">if</span><span>(req.method.toUpperCase()==</span><span class="string">'POST'</span><span>)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> postData=</span><span class="string">&quot;&quot;</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********** 读取Post提交的数据 **********/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.addListener(<span class="string">&quot;data&quot;</span><span>,</span><span class="keyword">function</span><span>(data)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;postData+=data;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********** 数据读取完毕就会执行的监听 *********/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.addListener(<span class="string">&quot;end&quot;</span><span>,</span><span class="keyword">function</span><span>()&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">/********* 定义Post请求主体 *********/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">var</span><span> query=require(</span><span class="string">'querystring'</span><span>).parse(postData);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">/********** 给客户端返回数据自造JSON **********/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">function</span><span> getJson(status)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(isNaN(status))status=-1;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&#123;status=Number(status)&#125;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> _drr=</span><span class="string">'&#123;'</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&quot;status&quot;:&quot;1&quot;,'</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&quot;name&quot;:&quot;'</span><span>+query.name+</span><span class="string">'&quot;,'</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&quot;gender&quot;:&quot;'</span><span>+query.gender+</span><span class="string">'&quot;&#125;'</span><span>;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> _arr=</span><span class="string">'&#123;'</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&quot;status&quot;:1,'</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&quot;url&quot;:&quot;http://www.liuxinxiu.com/&quot;,'</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&quot;dataList&quot;:'</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&#123;'</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&quot;siteId&quot;:101,'</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&quot;title&quot;:&quot;我的博客&#124;&#124;Node Server&quot;,'</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&quot;images&quot;:&quot;http://www.liuxinxiu.com/upload/2016/08/10/moren.gif&quot;,'</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&quot;indexNum&quot;:&quot;10&quot;,'</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&quot;pageNum&quot;:&quot;100000&quot;,'</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&quot;tagNum&quot;:&quot;22&quot;,'</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&quot;linkType&quot;:&quot;linkTaobao&quot;,'</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&quot;publishTime&quot;:&quot;23:15:30&quot;'</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&#125;'</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<span class="string">'&#125;'</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>._dr=JSON.parse(_drr);</span><span class="keyword">this</span><span>._ar=JSON.parse(_arr);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>._dt=</span><span class="keyword">this</span><span>._dr;</span><span class="keyword">this</span><span>._dt.getUser=</span><span class="keyword">this</span><span>._ar;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">var</span><span> errStr=&#123;</span><span class="string">&quot;status&quot;</span><span>:-1,</span><span class="string">&quot;info&quot;</span><span>:</span><span class="string">&quot;Request Error&quot;</span><span>&#125;;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">/********** 先初步设置头信息,跨域全放开稍后再进行匹配验证 **********/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">var</span><span> content_type,content_length,&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; content_type=<span class="string">'application/json; charset=utf-8'</span><span>;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; content_length=Buffer.byteLength(res,<span class="string">'utf8'</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res.setHeader(<span class="string">'Access-Control-Allow-Origin'</span><span>,</span><span class="string">'*'</span><span>);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res.setHeader(<span class="string">'Access-Control-Allow-Headers'</span><span>,</span><span class="string">'X-Requested-With'</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res.setHeader(<span class="string">'Access-Control-Allow-Methods'</span><span>,</span><span class="string">'GET,POST,PUT,DELETE,OPTIONS'</span><span>);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res.setHeader(<span class="string">'Content-Type'</span><span>,content_type);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res.setHeader(<span class="string">'Server'</span><span>,</span><span class="string">'NodeJs/'</span><span>+process.version);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">/************** 判断如果有POST过来规范的数据 *************/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">if</span><span>(query.name&amp;&amp;query.gender)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//调用数据</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getJson(1);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/******** 匹配客户端域名是否在数组列表中 ******/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//if(_self.in_array(origin,allow_origin))&#123;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(origin.yes)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res.setHeader(<span class="string">'Access-Control-Allow-Origin'</span><span>,origin.name);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res.end(JSON.stringify(_dt));&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">/******** 如有设置就取设置URL返回头信息 ********/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">if</span><span>(query.origin)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.setHeader(<span class="string">'Access-Control-Allow-Origin'</span><span>,query.origin);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.end(JSON.stringify(_dt));&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">/******** 没设置URL就返回无权限错误信息&nbsp;&nbsp;********/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">else</span><span>&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errStr.info=<span class="string">&quot;You don't have permission to submit!&quot;</span><span>;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.setHeader('Access-Control-Allow-Origin<span class="string">',origin.name);</span> </span></li><li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.end(JSON.stringify(errStr));</span> </span></li><li><span> </span></li><li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;</span> </span></li><li><span> </span></li><li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;</span> </span></li><li><span> </span></li><li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;</span> </span></li><li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /********* 没有所匹配的POST提交数据&#124;&#124;都要设头返回信息 ********/</span> </span></li><li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&#123;</span> </span></li><li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/******** 其他POST参数的提交&nbsp;&nbsp;********/</span> </span></li><li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(query)&#123;</span> </span></li><li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.writeHeader(res.statusCode,&#123;</span> </span></li><li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Access-Control-Allow-Origin&quot;:origin.name,</span> </span></li><li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Access-Control-Allow-Headers&quot;:&quot;X-Requested-With&quot;,</span> </span></li><li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Access-Control-Allow-Methods&quot;:&quot;GET,POST,PUT,DELETE,OPTIONS&quot;,</span> </span></li><li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Content-type&quot;:&quot;application/json; charset=utf-8&quot;</span> </span></li><li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;);</span> </span></li><li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var err=&#123;status:-1,info:&quot;Syntax error in parameters or arguments.&quot;&#125;;</span> </span></li><li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.end(JSON.stringify(err));</span> </span></li><li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;</span> </span></li><li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&#123;</span> </span></li><li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.writeHeader(res.statusCode,&#123;</span> </span></li><li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Content-type&quot;: &quot;text/html; charset=utf-8&quot;</span> </span></li><li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;);</span> </span></li><li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.end('</span><span>It is forbidden </span><span class="keyword">for</span><span> the URL request!');&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/****** 判断结束 ******/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">/****** 内部结束 ******/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&#125;&nbsp;&nbsp;</span></li><li><span>module.exports=<span class="keyword">new</span><span> CORS_Node();&nbsp;&nbsp;</span></span></li></ol></div><p>NodeJs数据提交接口地址 (不允许使用GET访问) ：<a href="http://liuxinxiu.com:3000/CORS_Node/" target="_blank"><u><strong><span style="color: rgb(51, 0, 255);">http://liuxinxiu.com:3000/CORS_Node/</span></strong></u></a></p><p><span style="color: rgb(255, 0, 0);">注意：NodeJs Server 是本站的测试环境，有时候因需要会临时关闭，该地址仅供测试，如您有需要请自建环境～</span></p><p>配合HTML代码如下：</p><div class="codeText"><div class="codeHead">XML/HTML代码</div><ol start="1" class="dp-xml"><li class="alt"><span><span>&lt;!DOCTYPE html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span><span class="tag">&lt;</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">meta</span><span> </span><span class="attribute">charset</span><span>=</span><span class="attribute-value">&quot;utf-8&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">meta</span><span> </span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">&quot;X-UA-Compatible&quot;</span><span> </span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;IE=edge,chrome=1&quot;</span><span> </span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">meta</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;viewport&quot;</span><span> </span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;width=device-width, initial-scale=1.0, user-scalable=no&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">meta</span><span> </span><span class="attribute">name</span><span>=&quot;format-detection&quot;</span><span class="attribute-value">content</span><span>=&quot;</span><span class="attribute">telephone</span><span>=</span><span class="attribute-value">no</span><span>&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">meta</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;apple-mobile-web-app-capable&quot;</span><span> </span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;yes&quot;</span><span> </span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">meta</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;apple-mobile-web-app-status-bar-style&quot;</span><span> </span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;black&quot;</span><span> </span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">style</span><span class="tag">&gt;</span><span>body,html &#123;background:#fff;font-family: &quot;Lucida Grande&quot;,Calibri,Arial;font-size:12pt;color: #333;background: #f8f8f8;text-align:center;&#125;*&#123;margin:0;padding:0;&#125;h1&#123;line-height:1.6em;font-size:24px;text-indent:.5em;padding-top:.6em&#125;i&#123;line-height:2em;font-size:18px;color:#999;&#125;.line&#123;height:10px;border-bottom:1px solid #ccc;font-size:0;overflow:hidden;&#125;</span><span class="tag">&lt;/</span><span class="tag-name">style</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>跨域测试</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">h1</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;show&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">h1</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span><span class="tag">&lt;</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;button&quot;</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;Click me&quot;</span><span> </span><span class="attribute">onclick</span><span>=</span><span class="attribute-value">&quot;msg()&quot;</span><span> </span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">script</span><span> </span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;//code.jquery.com/jquery-1.11.3.min.js&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li><span><span class="tag">&lt;</span><span class="tag-name">script</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">'text/javascript'</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>/********** 获取URL参数 **********/&nbsp;&nbsp;</span></li><li><span>function getQueryString(name)&#123;&nbsp;&nbsp;</span></li><li class="alt"><span>var <span class="attribute">reg</span><span>=</span><span class="attribute-value">new</span><span> RegExp(&quot;(^&#124;&amp;)&quot;+name+&quot;=([^&amp;]*)(&amp;&#124;$)&quot;,&quot;i&quot;);&nbsp;&nbsp;</span></span></li><li><span>var <span class="attribute">r</span><span>=</span><span class="attribute-value">window</span><span>.location.search.substr(1).match(reg);&nbsp;&nbsp;</span></span></li><li class="alt"><span>if (r!=null) return unescape(r[2]); return null;&nbsp;&nbsp;</span></li><li><span>&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>var <span class="attribute">_n</span><span>=</span><span class="attribute-value">getQueryString</span><span>('n');&nbsp;&nbsp;</span></span></li><li><span>var <span class="attribute">_url</span><span>=</span><span class="attribute-value">getQueryString</span><span>('url');&nbsp;&nbsp;</span></span></li><li class="alt"><span>var <span class="attribute">_name</span><span>=</span><span class="attribute-value">getQueryString</span><span>('name');&nbsp;&nbsp;</span></span></li><li><span>var <span class="attribute">_gender</span><span>=</span><span class="attribute-value">getQueryString</span><span>('gender');&nbsp;&nbsp;</span></span></li><li class="alt"><span>var <span class="attribute">_origin</span><span>=</span><span class="attribute-value">getQueryString</span><span>('origin');&nbsp;&nbsp;</span></span></li><li><span>var <span class="attribute">_error</span><span>=</span><span class="attribute-value">getQueryString</span><span>('error');&nbsp;&nbsp;</span></span></li><li class="alt"><span>console.log('origin:'+_origin+' &mdash;&mdash; name:'+_name+' &mdash;&mdash; gender:'+_gender);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span><span class="attribute">window.onload</span><span>=</span><span class="attribute-value">function</span><span>()&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;if(<span class="attribute">_n</span><span>=='php')&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">location.href</span><span>=</span><span class="attribute-value">'http://'</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +location.host&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +location.pathname&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +'?<span class="attribute">origin</span><span>=</span><span class="attribute-value">http</span><span>://'+location.host;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;else if(<span class="attribute">_n</span><span>=='node')&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">location.href</span><span>=</span><span class="attribute-value">'http://'</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +location.host&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +location.pathname&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +'?<span class="attribute">origin</span><span>=</span><span class="attribute-value">http</span><span>://'+location.host+'&amp;'&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +'<span class="attribute">url</span><span>=</span><span class="attribute-value">http</span><span>://liuxinxiu.com:3000/CORS_Node/'&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;else if(<span class="attribute">_n</span><span>=='proxy')&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">location.href</span><span>=</span><span class="attribute-value">'http://'</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +location.host&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +location.pathname&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +'?<span class="attribute">origin</span><span>=</span><span class="attribute-value">http</span><span>://'+location.host+'&amp;'&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +'<span class="attribute">url</span><span>=</span><span class="attribute-value">http</span><span>://liuxinxiu.com:3000/CORS_Node_Proxy/'&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;else if(<span class="attribute">_n</span><span>=='test')&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">location.href</span><span>=</span><span class="attribute-value">'http://test1.liuxinxiu.com/php/Interface/html/server.html'</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +'?<span class="attribute">origin</span><span>=</span><span class="attribute-value">http</span><span>://test1.liuxinxiu.com&amp;'&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +'<span class="attribute">url</span><span>=</span><span class="attribute-value">http</span><span>://liuxinxiu.com:3000/CORS_Node_Proxy/&amp;'&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +'<span class="attribute">error</span><span>=</span><span class="attribute-value">1</span><span>'&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>/********** 发起Ajax请求 **********/&nbsp;&nbsp;</span></li><li><span>function msg()&#123;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;/******* 动态切换提交数据 *******/&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;if(_origin&amp;&amp;!_error)&#123;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;if(_name&amp;&amp;_gender)&#123;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var <span class="attribute">data</span><span>=&#123;name:_name,gender:_gender,origin:_origin&#125;;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;else&#123;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var <span class="attribute">data</span><span>=&#123;name:&quot;xiaoming&quot;,gender:&quot;male&quot;,origin:_origin&#125;;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;else if(<span class="attribute">_error</span><span>==null)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;var <span class="attribute">data</span><span>=&#123;name:&quot;xiaoming&quot;,gender:&quot;male&quot;&#125;;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;else if(_error)&#123;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var <span class="attribute">data</span><span>=&#123;xxx:111&#125;;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;/******* 动态设置提交URL *******/&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;if(_url)&#123;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;var <span class="attribute">urlPath</span><span>=</span><span class="attribute-value">_url</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;else&#123;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;var <span class="attribute">urlPath</span><span>=</span><span class="attribute-value">'http://code.liuxinxiu.com/php/Post/CORS_PHP.php'</span><span>;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;$.ajax(&#123;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type:'post',&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url:urlPath,&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data:data,&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cache:false,&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataType:'json',&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; success:function(data)&#123;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(data.name)&#123;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(&quot;show&quot;)<span class="attribute">.innerHTML</span><span>=</span><span class="attribute-value">data</span><span>.name+' '+data.gender;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(data.status!=1)&#123;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(&quot;show&quot;)<span class="attribute">.innerHTML</span><span>=</span><span class="attribute-value">data</span><span>.info;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;,&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; error:function()&#123;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.log(&quot;请求错误//&quot;)&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;);&nbsp;&nbsp;</span></li><li class="alt"><span>&#125;;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>/***********************************************************************************************&nbsp;&nbsp;</span></li><li><span>$.post(&quot;http://www.server.com/server.php&quot;,&#123;name:&quot;fdipzone&quot;,gender:&quot;male&quot;&#125;).done(function(data)&#123;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(&quot;show&quot;)<span class="attribute">.innerHTML</span><span>=</span><span class="attribute-value">data</span><span>.name+' '+data.gender;&nbsp;&nbsp;</span></span></li><li><span>&#125;);&nbsp;&nbsp;</span></li><li class="alt"><span>**********************************************************************************************/&nbsp;&nbsp;</span></li><li><span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li></ol></div><p>HTML访问地址 (测试跨域) ==&gt; <a href="http://test1.liuxinxiu.com/php/Interface/html/server.html?n=node" target="_blank"><strong><u><span style="color: rgb(51, 0, 255);">http://test1.liuxinxiu.com/php/Interface/html/server.html?n=node</span></u></strong></a></p><p>HTML访问地址 (非法参数) ==&gt; <a href="http://test1.liuxinxiu.com/php/Interface/html/server.html?error=node" target="_blank"><strong><u><span style="color: rgb(51, 0, 255);">http://test1.liuxinxiu.com/php/Interface/html/server.html?error=node</span></u></strong></a></p><p><span style="color: rgb(255, 0, 0);">注意：本站的 NodeJs Server 是学习测试环境，有临时关闭的可能，建议在本地环境测试～</span></p><br/>Tags - <a href="http://liuxinxiu.com:80/tags/cors/" rel="tag">cors</a> , <a href="http://liuxinxiu.com:80/tags/node/" rel="tag">node</a> , <a href="http://liuxinxiu.com:80/tags/post/" rel="tag">post</a>
]]>
</description>
</item><item>
<link>http://liuxinxiu.com:80/node_Jsonp/</link>
<title><![CDATA[NodeJs JSONP数据接口定义]]></title> 
<author>刘新修 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[NodeJs平台]]></category>
<pubDate>Tue, 06 Sep 2016 10:09:23 +0000</pubDate> 
<guid>http://liuxinxiu.com:80/node_Jsonp/</guid> 
<description>
<![CDATA[ 
	<div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">var</span><span> http = require(</span><span class="string">'http'</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li><span><span class="keyword">var</span><span> urllib = require(</span><span class="string">'url'</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span><span class="keyword">var</span><span> port = 10011;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="keyword">var</span><span> data = &#123;</span><span class="string">'name'</span><span>: </span><span class="string">'jifeng'</span><span>, </span><span class="string">'company'</span><span>: </span><span class="string">'taobao'</span><span>&#125;;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>http.createServer(<span class="keyword">function</span><span>(req, res)&#123;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;<span class="keyword">var</span><span> params = urllib.parse(req.url, </span><span class="keyword">true</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;console.log(params);&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;<span class="keyword">if</span><span> (params.query &amp;&amp; params.query.callback) &#123;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//console.log(params.query.callback);&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> str =&nbsp;&nbsp;params.query.callback + </span><span class="string">'('</span><span> + JSON.stringify(data) + </span><span class="string">')'</span><span>;</span><span class="comment">//jsonp&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;res.end(str);&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&#125; <span class="keyword">else</span><span> &#123;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;res.end(JSON.stringify(data));<span class="comment">//普通的json&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&#125;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></li><li class="alt"><span>&#125;).listen(port, <span class="keyword">function</span><span>()&#123;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;console.log(<span class="string">'server is listening on port '</span><span> + port);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#125;)&nbsp;&nbsp;&nbsp;&nbsp;</span></li></ol></div><p>自建Node路由Jsonp接口访问地址：<a href="http://liuxinxiu.com:3000/jsonp?Jsoncallback=2016&amp;&amp;name=liuxinxiu" target="_blank">http://liuxinxiu.com:3000/jsonp?Jsoncallback=2016&amp;&amp;name=liuxinxiu</a></p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">function</span><span> jsonp()&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.exec=</span><span class="keyword">function</span><span>(route,req,res)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">var</span><span> data1=&#123;key:</span><span class="string">'value'</span><span>,hello:</span><span class="string">'world'</span><span>,name:</span><span class="string">'刘新修'</span><span>&#125;;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">var</span><span> data2=&#123;</span><span class="string">'name'</span><span>:</span><span class="string">'wangjiang'</span><span>,</span><span class="string">'company'</span><span>:</span><span class="string">'taobao'</span><span>&#125;;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.log(req+<span class="string">'---'</span><span>+route)&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res.statusCode=200;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">//res.setHeader('content-type','application/json;charset=utf-8');</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">//res.setHeader('Content-Type','text/html');</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">//req.write(data);</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">//req.end();</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">var</span><span> params=url.parse(req.url,</span><span class="keyword">true</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.log(params);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">if</span><span>(params.query&amp;&para;ms.query.Jsoncallback)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.log(params.query.Jsoncallback);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">var</span><span> str=params.query.Jsoncallback+</span><span class="string">'('</span><span>+JSON.stringify(data1)+</span><span class="string">')'</span><span>;</span><span class="comment">//jsonp</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res.end(str);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">else</span><span>&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res.writeHead(200,&#123;<span class="string">'Content-Type'</span><span>:</span><span class="string">'application/json'</span><span>&#125;);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res.end(JSON.stringify(data1));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//普通的json</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp; &#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&#125;&nbsp;&nbsp;</span></li><li><span>module.exports=<span class="keyword">new</span><span> jsonp();&nbsp;&nbsp;</span></span></li></ol></div><p>自建Node路由Jsonp接口访问地址：<a href="http://liuxinxiu.com:3000/Jsoncallback?Jsoncallback=1&amp;name=Jack" target="_blank">http://liuxinxiu.com:3000/Jsoncallback?Jsoncallback=1&amp;name=Jack</a></p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">function</span><span>&nbsp;jsoncallback()&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.exec=</span><span class="keyword">function</span><span>(route,req,res)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/********&nbsp;处理请求判断用作JSONP&nbsp;********/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;params=url.parse(req.url,</span><span class="keyword">true</span><span>);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**********&nbsp;造数据要Obj不要String&nbsp;**********/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;str2=&#123;dataList:[&#123;name:</span><span class="string">&quot;Jack&quot;</span><span>,age:28,sex:1&#125;,&#123;name:</span><span class="string">'Tony'</span><span>,age:30,sex:0&#125;]&#125;;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**********&nbsp;映射数据源无为undefined&nbsp;**********/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;output=2016+</span><span class="string">'('</span><span>+JSON.stringify(str2)+</span><span class="string">')'</span><span>;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;result=params.query.Jsoncallback+</span><span class="string">'('</span><span>+JSON.stringify(str2)+</span><span class="string">')'</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/*************&nbsp;定义头部信息及编码规范&nbsp;*******************/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.writeHead(200,&#123;<span class="string">'content-Type'</span><span>:</span><span class="string">'application/json;charset=utf-8'</span><span>&#125;);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/*************&nbsp;判断出来相应返回的结果&nbsp;********************/</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(params.query&amp;&para;ms.query.Jsoncallback)&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.write(result);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.end();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.write(output);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.end();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&#125;;&nbsp;&nbsp;</span></li><li><span>module.exports=<span class="keyword">new</span><span>&nbsp;jsoncallback();&nbsp;&nbsp;</span></span></li></ol></div><br/>Tags - <a href="http://liuxinxiu.com:80/tags/jsonp/" rel="tag">jsonp</a> , <a href="http://liuxinxiu.com:80/tags/node/" rel="tag">node</a>
]]>
</description>
</item>
</channel>
</rss>