是时候考虑用 Node.js 做点东西了


除非你是多年生活在石器时代,否则你不会没听说过 Node.js,一套用来编写高性能网络服务器的JavaScript平台。如果你跟我一样是一个 .NET 工程师,主要开发 Windows 下的各种应用,那么在听到 Node.js 介绍时你的反应可能是:哦,这不错,然后继续工作。但我想说的是,现在是时候用 Node.js 来开发应用了,它可以简化很多现有工具所作的工作,而且 Node.js 在 Windows 下也已经足够成熟。一个很好的例子就是 iisnode ,可以直接在 IIS 上运行 Node.js 应用。

我们来写一个小例子,我需要编写一个小的 Web 服务,只是简单的在响应之前等待一秒钟。我同时想测试一下 EasyNetQ 的异步 IO 处理。我之前的测试是用 .NET 开发的,下面是我实现的 IHttpHandler 代码:

 
01 using System;
02 using System.Threading;
03 using System.Threading.Tasks;
04 using System.Web;
05   
06 namespace TestHttpHandler
07 {
08     public class TimerHandler : IHttpAsyncHandler
09     {
10         public void ProcessRequest(HttpContext context)
11         {
12             throw new InvalidOperationException("This handler cannot be called synchronously");
13         }
14   
15         public bool IsReusable
16         {
17             get { return false; }
18         }
19   
20         public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback callback, object state)
21         {
22             var taskCompletionSouce = new TaskCompletionSource<bool>(state);
23             var task = taskCompletionSouce.Task;
24   
25             var timer = new Timer(timerState =>
26             {
27                 context.Response.Write("OK");
28                 callback(task);
29                 taskCompletionSouce.SetResult(true);
30             });
31             timer.Change(1000, Timeout.Infinite);
32   
33             return task;
34         }
35   
36         public void EndProcessRequest(IAsyncResult result)
37         {
38             // nothing to do
39         }
40     }
41 }

你看出来了,写一个非堵塞的服务器挺不容易的,你必须仔细处理 TPL 和 APM,这对很多中级 .NET 开发者来说都已经挺难的了。为了运行上述代码,我还必须在 IIS 中设置一个新的 Web 应用,并配置 Web.config 文件,尽管事情不算太多,但已经让我厌倦。

那么用 Node.js 该怎么写上述的服务呢?

 
01 var http = require('http');
02   
03 http.createServer(function (req, res) {
04     setTimeout(function () {
05         res.writeHead(200, { 'Content-Type': 'text/plain' });
06         res.end('OK');
07     }, 1000);
08 }).listen(1338);
09   
10 console.log('LongRunningServer is at http://localhost:1338/');
首先,代码明显减少很多,Node 本身是异步的,你无需理解 JavaScript 在处理异步IO方面的任何术语,编写你的服务就是了。尽管我自己是个 Node 的初学者,但我已经可以很快速的编写上面的例子,而且要运行上面的代码也非常的简单,在装好 Node 后只需要打开命令行窗口,执行如下命令即可:  
1 node LongRunningServer.js

我还没有想过要放弃 .NET ,但我想,是时候考虑在我的 .NET 应用中采用 Node 来做点事情了。

更多关于Node.js的详细信息,或者下载地址请点这里

相关内容