在Mac OS下使用Node.js的简单教程


Posted in Javascript onJune 24, 2015

这里有一篇很好的 Node.js 介绍文章 great nodejs intro ,它将给你一个非常方便的介绍 Node.js 和 CouchDB,并给出一个实例实现 REST 的服务用于执行书签的 CRUD 操作,使用 CouchDB 作为数据库。

本文将介绍在 Mac OS X 下安装并开始使用 Node.js ,这个过程大概需要 30 分钟左右的时间,其中我们还将安装 CouchDB,并实现基于 CouchDB 的 REST API。

本文假设你机器上已经装有Git,如果还没有,请参考此文进行安装。

安装 node.js 和 npm

最简单的方法是在 node.js 的官网上通过 the nodejs download section 页面并选择 Mac 下的安装程序,它将在你的机器上安装 Node.js 和 npm (node package manager). 
 安装成功后你就可以使用 node 和 npm 命令了。

安装 CouchDB

因为本文需要使用 CouchDB 来存储对象,因此还需要安装 CouchDB.

安装 CouchDB 稍微麻烦一些,因为我们需要下载源码然后编译I,在此之前需要先安装 Homebrew ,请执行以下命令:
 

git clone https://github.com/mxcl/homebrew.git
cd homebrew/bin
brew install autoconf automake libtool
brew install couchdb

重要的提示:CouchDB 之前报出一个问题可能会阻止你安装,要修复这个问题需要手工编辑 ~/couch/homebrew/Library/Formula/couchdb.rb 文件,编辑内容如下:
 

require 'formula'

 

class Couchdb < Formula

  url 'http://www.apache.org/dyn/closer.cgi?path=couchdb/source/1.1.1/apache-couchdb-1.1.1.tar.gz'

  homepage "http://couchdb.apache.org/"

  md5 'cd126219b9cb69a4c521abd6960807a6'

请注意需要将 url 中的 source 删除,最终修改结果如下:
 

require 'formula'

 

class Couchdb < Formula

  url 'http://www.apache.org/dyn/closer.cgi?path=couchdb/1.1.1/apache-couchdb-1.1.1.tar.gz'

  homepage "http://couchdb.apache.org/"

  md5 'cd126219b9cb69a4c521abd6960807a6'

如果安装过程被挂起了,你需要 CTRL-C 终止并执行下面命令重试:
 

./brew install -v couchdb

更多关于 Mac OS X 上安装 CouchDB 的信息请阅读 "Installing CouchDB on OSX".

一旦 CouchDB 编译完成,我们可以手工执行 ./couchdb 来启动它,你可以在浏览器中打开 http://127.0.0.1:5984/_utils 这个地址以验证 CouchDB 安装是否成功。

在Mac OS下使用Node.js的简单教程

 下载教程

现在所需的软件都已经安装完成,我们接下来继续 Node.js 的介绍实例。

首先我们使用 Git 来获取实例源码
 
git clone https://github.com/indexzero/nodejs-intro.git
创建 CouchDB 数据库
在开始教程之前我们需要创建一个 CouchDB 数据库,先确保 CouchDB 已经启动,然后使用如下命令创建数据库:
 
$ curl -X PUT http://127.0.0.1:5984/pinpoint-dev10
{"ok":true}

你可以在浏览器中访问 http://127.0.0.1:5984/_utils 就可以看到新创建的数据库。

这里还有一个非常棒的 CouchDB 的指南。

开始教程

node js 实例使用模块化的方式构建,lib 目录包含很多模块,而服务器脚本在 bin 目录下。

例如,我们要启动 CouchDB 教程,可以在 bin 目录下执行下面命令:
 
./server -t 02couchdb -s

其中 -t 参数允许你指定要执行的 lib 目录下的模块,-s 参数用以设置我们刚建立的 pinpoint-dev 数据库。

sys - util 变化

根据 Node.js 的版本不同,你可能会看到如下的错误或者是警告:
 

$ node -v

v0.7.7-pre

 

$ ./server -t 02couchdb -s

 

node.js:247

        throw e; // process.nextTick error, or 'error' event on first tick

              ^

Error: The "sys" module is now called "util".

    at sys.js:1:69

    at NativeModule.compile (node.js:572:5)

    at Function.require (node.js:540:18)

    at Function._load (module.js:297:25)

    at Module.require (module.js:357:17)

    at require (module.js:373:17)

    at Object. (/home/ubuntu/nodejs-intro/bin/server:3:11)

    at Module._compile (module.js:444:26)

    at Object..js (module.js:462:10)

    at Module.load (module.js:351:32)

为了避免这个问题,你需要将所有调用 `require("sys")` 替换成 `require("util")`

Node v0.6.14 不会抛出错误信息,但会提示警告:
 

$ node -v

v0.6.14

 

$ ./server -t 02couchdb -s

The "sys" module is now called "util". It should have a similar interface.

Pinpoint demo server listening for 02couchdb on http://127.0.0.1:8000

运行教程

当你运行某个教程时,会提示一些错误:

 

$ ./server 02couchdb

The "sys" module is now called "util". It should have a similar interface.

 

node.js:201

        throw e; // process.nextTick error, or 'error' event on first tick

              ^

Error: Cannot find module 'optimist'

    at Function._resolveFilename (module.js:332:11)

    at Function._load (module.js:279:25)

    at Module.require (module.js:354:17)

    at require (module.js:370:17)

    at Object. (/Users/ddewaele/Projects/Node/nodejs-intro/bin/server:5:12)

    at Module._compile (module.js:441:26)

    at Object..js (module.js:459:10)

    at Module.load (module.js:348:31)

    at Function._load (module.js:308:12)

    at Array.0 (module.js:479:10)

该教程包含很多依赖,我们需要使用 npm 来下载这些依赖的包。
 
安装 node 包

Node packages (dependencies) 可通过 npm 命令来安装,例如:
 

$ npm install optimist
npm http GET https://registry.npmjs.org/optimist
npm http 200 https://registry.npmjs.org/optimist
npm http GET https://registry.npmjs.org/optimist/-/optimist-0.2.8.tgz
npm http 200 https://registry.npmjs.org/optimist/-/optimist-0.2.8.tgz
npm http GET https://registry.npmjs.org/wordwrap
npm http 200 https://registry.npmjs.org/wordwrap
npm http GET https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz
npm http 200 https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz
optimist@0.2.8 ../node_modules/optimist
└── wordwrap@0.0.2

这些包将被安装到 node_modules 文件夹中:
 

$ ls -l ../node_modules/
total 0
drwxr-xr-x 10 ddewaele staff 340 Apr 1 18:54 optimist

本文需要安装如下的 node 包:
 

npm install winston
npm install cradle
npm install journey
npm install optimist

运行教程

进入 bin 目录,通过下面命令来运行教程:
 

$ ./server -t 02couchdb -s
The "sys" module is now called "util". It should have a similar interface.
Pinpoint demo server listening for 02couchdb on http://127.0.0.1:8000

然后打开浏览器访问 http://127.0.0.1:8000/bookmarks ,将会看到如下的结果:
 

{"bookmarks":[]}

这表示服务已经启动并运行,为了在 CouchDB 中添加点测试数据,我们可以使用 http-console 控制台来访问 CouchDB 的 REST 服务。

安装 http-console

有一个非常棒的工具可以帮助你调试服务,该工具名为 http-console ,你可使用 npm 来安装:
 

sudo npm install -g http-console

然后就可以在命令行中执行该工具,不幸的是当我们执行该命令时报错了:
 

$ http-console
 
 
node.js:201
    throw e; // process.nextTick error, or 'error' event on first tick
       ^
Error: require.paths is removed. Use node_modules folders, or the NODE_PATH environment variable instead.
  at Function. (module.js:378:11)
  at Object. (/usr/local/lib/node_modules/http-console/bin/http-console:6:8)
  at Module._compile (module.js:441:26)
  at Object..js (module.js:459:10)
  at Module.load (module.js:348:31)
  at Function._load (module.js:308:12)
  at Array.0 (module.js:479:10)
  at EventEmitter._tickCallback (node.js:192:40)

很麻烦,我们还需要手工编辑 /usr/local/lib/node_modules/http-console/bin/http-console 文件,然后删除下面这一行:
 

require.paths.unshift(path.join(__dirname, '..', 'lib'));

现在 http-console 就可以启动了,无需任何参数,它将连接到 http://localhost:8080 ,如果你需要指定服务器和端口,把它作为第一个参数传递给 http-console 即可。

请注意我们这里使用了 \json 命令用来设置正确的 content-type:
 

$ http-console http://127.0.0.1:8000
The "sys" module is now called "util". It should have a similar interface.
> http-console 0.6.1
> Welcome, enter .help if you're lost.
> Connecting to 127.0.0.1 on port 8000.
 
http://127.0.0.1:8000/> \json
http://127.0.0.1:8000/>

访问 REST 服务

在 http-console 中,要执行 GET 请求只需要输入 GET /bookmarks 即可:
 

http://127.0.0.1:8000/> GET /bookmarks
HTTP/1.1 200 OK
Date: Sun, 01 Apr 2012 17:23:27 GMT
Server: journey/0.4.0
Content-Type: application/json;charset=utf-8
Content-Length: 16
Connection: keep-alive
 
{
  bookmarks: []
}

你也可以使用 JSON 的片段来执行 POST 请求:
 

http://127.0.0.1:8000/> POST /bookmarks
... { "url": "http://nodejs.org" }
HTTP/1.1 200 OK
Date: Thu, 05 Apr 2012 11:45:55 GMT
Server: journey/0.4.0
Content-Type: application/json;charset=utf-8
Content-Length: 91
Connection: keep-alive
 
{
  bookmark: {
    _id: 'WD-G-1',
    resource: 'Bookmark',
    url: 'http://nodejs.org'
  }
}

然后再次执行 GET 请求,你就可以看到新插入的数据了:
 

http://127.0.0.1:8000/> GET /bookmarks
HTTP/1.1 200 OK
Date: Sun, 01 Apr 2012 17:23:27 GMT
Server: journey/0.4.0
Content-Type: application/json;charset=utf-8
Content-Length: 16
Connection: keep-alive
 
{
  bookmarks: [
    {
      _rev: '1-cfced13a45a068e95daa04beff562360',
      _id: 'WD-G-1',
      resource: 'Bookmark',
      url: 'http://nodejs.org'
    }
  ]
}
Javascript 相关文章推荐
jquery tools系列 expose 学习
Sep 06 Javascript
jquery中常用的函数和属性详细解析
Mar 07 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
Apr 01 Javascript
jQuery结合ajax实现动态加载文本内容
May 19 Javascript
深入剖析JavaScript编程中的对象概念
Oct 21 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
Nov 04 Javascript
使用js获取地址栏参数的方法推荐(超级简单)
Jun 14 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
Jan 13 Javascript
vue将毫秒数转化为正常日期格式的实例
Sep 16 Javascript
vue组件中的样式属性scoped实例详解
Oct 30 Javascript
详解搭建一个vue-cli的移动端H5开发模板
Jan 17 Javascript
H5 js点击按钮复制文本到粘贴板
Nov 19 Javascript
在Node.js应用中使用Redis的方法简介
Jun 24 #Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
Jun 24 #Javascript
浅析Node.js中的内存泄漏问题
Jun 23 #Javascript
充分发挥Node.js程序性能的一些方法介绍
Jun 23 #Javascript
Node.js编程中客户端Session的使用详解
Jun 23 #Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
Jun 23 #Javascript
使用Node.js为其他程序编写扩展的基本方法
Jun 23 #Javascript
You might like
PHP中实现图片的锐化
2006/10/09 PHP
PHP 的 __FILE__ 常量
2007/01/15 PHP
php生成局部唯一识别码LUID的代码
2012/10/06 PHP
合格的PHP程序员必备技能
2015/11/13 PHP
深入浅析php json 格式控制
2015/12/24 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
2016/09/22 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
js获取当前select 元素值的代码
2010/04/19 Javascript
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
javascript的函数、创建对象、封装、属性和方法、继承
2011/03/10 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
2014/03/05 Javascript
jquery操作复选框checkbox的方法汇总
2015/02/05 Javascript
js中的关联数组与普通数组详解
2016/07/27 Javascript
JS数组去重(4种方法)
2017/03/27 Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
2019/05/21 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
小程序点击图片实现png转jpg
2019/10/22 Javascript
jQuery实现鼠标移入显示蒙版效果
2020/01/11 jQuery
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
夯基础之手撕javascript继承详解
2020/11/09 Javascript
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
[03:12]完美世界DOTA2联赛PWL DAY7集锦
2020/11/06 DOTA
python设计模式大全
2016/06/27 Python
python3 实现口罩抽签的功能
2020/03/11 Python
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
在校生钳工实习自我鉴定
2013/09/19 职场文书
数控专业个人求职信范例
2013/11/29 职场文书
校园之声广播稿
2014/01/31 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
社会实践的活动方案
2014/08/22 职场文书
车间主任岗位职责范本
2015/04/08 职场文书
员工表扬信怎么写
2015/05/05 职场文书
物资采购管理制度
2015/08/06 职场文书