在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 相关文章推荐
js 判断一个元素是否在页面中存在
Dec 27 Javascript
js使用正则实现ReplaceAll全部替换的方法
Jul 18 Javascript
jQuery焦点图轮播特效代码分享(3款)
Sep 05 Javascript
jQuery EasyUI封装简化操作
Sep 18 Javascript
JS前向后瞻正则表达式定义与用法示例
Dec 27 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
Feb 08 Javascript
JavaScript实现无穷滚动加载数据
May 06 Javascript
vue2导航根据路由传值,而改变导航内容的实例
Nov 10 Javascript
react native 获取地理位置的方法示例
Aug 28 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
Sep 24 Javascript
VUE 解决mode为history页面为空白的问题
Nov 01 Javascript
深入讲解Vue中父子组件通信与事件触发
Mar 22 Vue.js
在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/11/26 PHP
PHP 生成的XML以FLASH获取为乱码终极解决
2009/08/07 PHP
php session和cookie使用说明
2010/04/07 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
php简单处理XML数据的方法示例
2017/05/19 PHP
JavaScript 中的replace方法说明
2007/04/13 Javascript
JavaScript Event学习第九章 鼠标事件
2010/02/08 Javascript
ASP.NET中AJAX 调用实例代码
2012/05/03 Javascript
使用js简单实现了tree树菜单
2013/11/20 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
2013/12/20 Javascript
在百度知道团队中快速审批新成员的js脚本
2014/02/02 Javascript
EasyUi datagrid 实现表格分页
2015/02/10 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
2016/05/25 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
详解Python中的__new__()方法的使用
2015/04/09 Python
Python的Tornado框架异步编程入门实例
2015/04/24 Python
python删除特定文件的方法
2015/07/30 Python
python二分查找算法的递归实现方法
2016/05/12 Python
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
Python中的is和==比较两个对象的两种方法
2017/09/06 Python
基于python实现在excel中读取与生成随机数写入excel中
2018/01/04 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
利用python-docx模块写批量生日邀请函
2019/08/26 Python
Python如何实现在字符串里嵌入双引号或者单引号
2020/03/02 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
浅谈CSS3 动画卡顿解决方案
2019/01/02 HTML / CSS
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
公务员总结性个人自我评价
2013/12/05 职场文书
机关办公室岗位职责
2014/04/16 职场文书
政协会议宣传标语
2014/10/09 职场文书
公司董事任命书
2015/09/21 职场文书
Python标准库之typing的用法(类型标注)
2021/06/02 Python