Node.js入门 – 永恒的Hello World!

本文自theprojectspot.com翻译而来,文章原作者为Lee Jacobson, 已经作者授权翻译用于非商业用途。原文地址:猛戳这里进入

介绍

 

这是我的关于Node.js系列入门教程的第一篇。必须说明一下,我并不是Node.js的专家,但是尝试向别人解释这是怎么回事是自我学习的一个好方法。如果你发现有些地方并不是那么正确,请提出来让我知道以便修正,谢之。

 

最近Node.js如此流行,到处是讨论这个的话题,我决定一探究竟学学这玩意儿。软件行业技术更新如此之快,如果落在后面是很危险滴(汗,这哥们 才20岁出头,就有这么强的落后于时代的危机感)。如果你不想落后于时代,不想失业,学习新的编程语言更新自己的技能是作为程序员非常重要的一件事情。如 果你不能认真对待此事,想想那些菜鸟新程序员不能找到工作的悲惨境地吧。

 

好了,闲话少说,进入正题(铛铛铛铛)。

 

Node.js是一个服务器端JavaScript实现。这意味着所有Javascript的牛B特性都能在Node.js里得到支 持,同样意味着如果你以前有JavaScript编程经验的话,你学习Node.js将占有极大的优势。Node.js刚出现没几年,哪怕是一直用这个东 西工作的,也只是几年,对比C这些古老语言有这么多人在用,这玩意没多少人会,如果你会的话,比单纯php程序员的竞争力要提高不少吧?(作者观点,用 php的同学不要在评论里骂我。。。)

开始Hello World吧

让我们来开始写第一个Hello Wrold程序,首先到http://www.nodejs.org 去下载并安装node.js。安装好之后,用你喜欢的文本编辑器创建一个JavaScript文件,内容如下:

console.log("Hello World");

保存为”hello.js” ,并且在终端里用如下命令运行程序:

node hello.js

现在你应该在终端里看到金光闪闪的“Hello World”两个大字了。如果只想看到这两个字,那么到这里就完了,不过我相信你更想看到在浏览器里怎么看到这两个字,好吧,打开你刚才创建的hello.js这个文件,重新编辑如下:

    var http = require('http');

    http.createServer(function (request, response) {
        response.writeHead(200, {'Content-Type': 'text/plain'});
        response.end('Hello World\n');
    }).listen(8080);

    console.log('Server started');

保存文件然后执行:

node hello.js

终端里应该看到“Server started”,用浏览器打开http://localhost:8080,我操,金光闪闪的“Hello World”出现在浏览器里了。

 

让我们来回顾一下我们刚才写的代码。

 

第一行是获取一个http组件并赋值给变量”http”,http是Node.js的内置组件, 方便我们创建Node.js应用的东东。

 

我们可以通过调用Node.js的http组件的”createServer”方法来创建一个http服务, 这个方法返回一个对象,并且需要一个函数作为参数。

 

调用返回对象的方法listen来侦听端口,参数值就是你需要侦听的端口数值,这也是刚才为什么我们要用http://localhost:8080去请求的原因,代码里指定了这个端口。

 

我们还创建了一个函数作为参数传入createServer,在JavaScript编程中这是一个常用的做法,函数可以像变量或者对象一样作为参 数传入别的方法。当我们创建的http服务每次接收到从8080端口过来的请求时,执行传入的函数,而我们传入的函数称之为匿名函数,因为我们没有给它命 名。

 

你可能注意到作为参数的匿名函数有两个参数,”request”和”response”,这两个参数由http服务在接收到请求时传入,它们都是对象,request用于获取请求内容,response用于我们返回相关信息。

 

在这个匿名函数中,第一件事是调用response的writeHead函数设置将要返回的http状态(200成功,403无权限,500异常,等等),同时设置Content-Type头,告诉浏览器我们返回的是纯文本。

 

接下来我们利用response对象输出金光闪闪的Hello World了,这里我们只是简单地调用response的write方法然后结束,所以用response的end来结束本次响应。

让我们的响应更有趣一点

就算我不断加上”金光闪闪”的定语,也无法掩饰Hello World是一个无聊的程序(好吧,所有程序员都是通过写一个无聊的程序开始的…), 让我们来写一个稍微不那么无聊的程序:用户计数器。用Node.js创建一个用户计数器巨简单,甚至不像php一样可能需要数据库。(原文如此,事实上别 的技术也可以不需要数据库之类的,利用全局会话等来实现,作者的意思可能是直接可以使用变量计数,但下文的变量在请求之外,相当于一个全局变量)。

 

创建一个叫counter.js的文件,并写入:

    var http = require('http');

    var userCount = 0;
    http.createServer(function (request, response) {
        console.log('New connection');
        userCount++;

        response.writeHead(200, {'Content-Type': 'text/plain'});
        response.write('Hello!\n');
        response.write('We have had '+userCount+' visits!\n');
        response.end();
    }).listen(8080);

    console.log('Server started');

然后运行之:

node counter.js

这时候访问http://localhost:8080,你就可以看到访问次数,刷新这个数字会增长。

 

注:你可能会看到一个奇怪的现象,每刷新一次,数值增加是2而不是1,这是因为你的浏览器同时请求了http://localhost:8080/favicon.ico。

 

你可以在终端的输出看到每次请求的情况。

 

这个程序的主要功能就是先定义一个userCount的变量,然后每次接收到请求时+1,并输出到浏览器。

 

在PHP里你要实现相同功能的话,需要保存信息到类似文本或者数据库的东西里面去。(又黑PHP…)

 

转自:http://www.laonan.net/blog/63/

 

补充:

Hello World
好了,让我们开始实现第一个 Node.js 程序吧。打开你常用的文本编辑器,在其中输入:

console.log('Hello World');

将文件保存为 helloworld.js,打开终端,进入 helloworld.js 所在的目录,执行以下命令:

node helloworld.js

如果一切正常,你将会在终端中看到输出 Hello World 。很简单吧?下面让我们来解释一下这个程序的细节。 console 是 Node.js 提供的控制台对象,其中包含了向标准输出写入的操作,如 console.log 、 console.error 等。 console.log 是我们最常用的输出指令,它和 C 语言中的 printf 的功能类似,也可以接受任意多个参数,支持 %d 、 %s 变量引用,例如:

//consolelog.js
console.log('%s: %d', 'Hello', 25);

输出的是 Hello: 25。
小技巧——使用 supervisor
如果你有 PHP 开发经验,会习惯在修改 PHP 脚本后直接刷新浏览器以观察结果,而你在开发 Node.js 实现的 HTTP 应用时会发现,无论你修改了代码的哪一部份,都必须终止Node.js 再重新运行才会奏效。这是因为 Node.js 只有在第一次引用到某部份时才会去解析脚本文件,以后都会直接访问内存,避免重复载入,而 PHP 则总是重新读取并解析脚本(如果没有专门的优化配置)。Node.js的这种设计虽然有利于提高性能,却不利于开发调试,因为我们在开发过程中总是希望修改后立即看到效果,而不是每次都要终止进程并重启。
supervisor 可以帮助你实现这个功能,它会监视你对代码的改动,并自动重启 Node.js。使用方法很简单,首先使用 npm 安装 supervisor:

npm install -g supervisor

如果你使用的是 Linux 或 Mac,直接键入上面的命令很可能会有权限错误。原因是 npm
需要把 supervisor 安装到系统目录,需要管理员授权,可以使用

sudo npm install -g supervisor
命令来安装。
接下来,使用 supervisor 命令启动 app.js:

supervisor app.js

 

Loading

Add a Comment

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.