在网上发现一篇nodeJS教程,名为七天学会NodeJS,标题很有吸引力。我不指望七天能学会,只希望可以入门,下面是我的学习笔记和遇到的问题。

教程网址:http://nqdeng.github.io/7-days-nodejs/

系统环境:virtualBox ubuntu 14.10

nodeJS版本:0.10.35

一、安装

我使用过三种方法来安装nodeJS,分别是二进制文件、apt-get命令和编译安装。

  1. 从官网下载对应系统的二进制文件,双击安装。网站:http://www.nodejs.org/download/
  2. 在ubuntu下使用命令apt-get安装,命令如下:
    sudo apt-get install nodejs
    sudo apt-get install npm
  3. 从官网下载源码,编译安装。我参考了博客园的一篇文章,地址:http://www.cnblogs.com/hwpayg/archive/2012/11/04/2753404.html

二、模块

在nodeJS中,一般会将代码模块化。在编写模块时,一般会用到三个变量:require、exports、module。

  1. require用于加载和使用别的模块。如:

     var foo1 = require('./foo');
     var foo2 = require('./foo.js');
     var foo3 = require('/home/user/foo');
     var foo4 = require('/home/user/foo.js');
    
     // 也可以用来加载JSON文件
     var data = require('./data.json');
  2. exports是导出对象,用于导出当前模块中的公有方法与属性,在其他模块中使用require得到的就是exports对象。下面的例子导出了一个公有方法
     exports.hello = function () {
         console.log('Hello World!');
     };
  3. module对象可以访问到当前模块的一些相关信息,常用于替换当前模块中的导出对象,如:
     module.exports = function () {
         console.log('Hello World!');
     };

三、包

有些模块比较复杂,需要由多个子模块组成,我们把由多个子模块组成的大模块称为包。如:

// 下面是包cat的目录结构,main.js是包的入口文件
- /home/user/lib/
    - cat/
        head.js
        body.js
        main.js

这时,我们加载包cat的方式就是 require("/home/user/lib/cat/main"),但这看起来像是访问一个文件。为了让访问路径更加简洁,可以进行以下调整:

// package.json是包cat的配置文件
- /home/user/lib/
    - cat/
        + doc/
        - lib/
            head.js
            body.js
            main.js
        + tests/
        package.json

其中,package.json的内容如下:

 {
     "name": "cat",
     "main": "./lib/main.js"
 }

这样,加载包cat的方式就是 require("/home/user/lib/cat")

四、命令行程序

正常,使用js文件的方式是 node /home/user/bin/node-echo.js Hello World 。这样子显然不够酷,如果想让js文件像命令行程序那样使用,如: node-echo Hello World 。在linux环境中,我们可以做如下配置:

  1. 在js文件顶部插入代码 #! /usr/bin/env node ,用于指定当前脚本的解析器。
  2. 赋予js代码文件执行权限 chmod +x /home/user/bin/node-echo.js
  3. 创建软链: sudo ln -s /home/user/bin/node-echo.js /usr/local/bin/node-echo

这样我们可以像使用命令行程序那样使用js代码。

五、工程目录

一般,一个标准的工程目录看起来是这个样子的:

- /home/user/workspace/node-echo/   # 工程目录
    - bin/                          # 存放命令行相关代码
        node-echo
    + doc/                          # 存放文档
    - lib/                          # 存放API相关代码
        echo.js
    - node_modules/                 # 存放三方包
        + argv/
    + tests/                        # 存放测试用例
    package.json                    # 元数据文件
    README.md                       # 说明文件

六、文件操作

小文件操作

 var fs = require('fs');

 function copy(src, dst) {
     fs.writeFileSync(dst, fs.readFileSync(src));
 }

 function main(argv) {
     copy(argv[0], argv[1]);
 }

 main(process.argv.slice(2));

上面的代码会将src文件内容一次性读取到内存,然后再一次性写到磁盘中。这种操作只适用于小文件,文件太大时,内存会不够用。

大文件操作

 var fs = require('fs');

 function copy(src, dst) {
     fs.createReadStream(src).pipe(fs.createWriteStream(dst));
 }

 function main(argv) {
     copy(argv[0], argv[1]);
 }

 main(process.argv.slice(2));

Buffer (数据块)

nodeJS使用Buffer类来进行二进制数据的操作。如:

 // 创建一个Buffer类的实例
 var bin = new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]);

 // 获取指定位置的字节
 bin[0]; // => 0x68;

 // 转化为字符串
 var str = bin.toString('utf-8'); // => "hello"

 // 字符串转化为二进制数据
 var bin = new Buffer('hello', 'utf-8'); // => <Buffer 68 65 6c 6c 6f>

Stream (数据流)

 var rs = fs.createReadStream(src);
 var ws = fs.createWriteStream(dst);

 rs.on('data', function (chunk) {
     if (ws.write(chunk) === false) {
         rs.pause();
     }
 });

 rs.on('end', function () {
     ws.end();
 });

 ws.on('drain', function () {
     rs.resume();
 });

 File System (文件系统)

nodeJS通过内置模块fs提供对文件的操作,fs的API基本可以分为三类:

  1. 文件属性操作,如:fs.stat fs.chmod fs.chowd
  2. 文件内容操作,如:fs.readFile fs.readdir fs.writeFile fs.mkdir
  3. 底层文件操作,如:fs.open fs.read fs.write fs.close

下面以fs.readFile为例,说明fs的API用法

 fs.readFile(pathname, function (err, data) {
     if (err) {
         // Deal with error.
     } else {
         // Deal with data.
     }
 });

七、网络编程

创建一个简单http服务器

 var http = require('http');

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

注意:监听1024以下端口时,需要root权限

七天学会NodeJS-学习笔记的更多相关文章

  1. Nodejs学习笔记(三)——一张图看懂Nodejs建站

    前言:一条线,竖着放,如果做不到精进至深,那就旋转90°,至少也图个幅度宽广. 通俗解释上面的胡言乱语:还没学会爬,就学起走了?! 继上篇<Nodejs学习笔记(二)——Eclipse中运行调试 ...

  2. Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...

  3. [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...

  4. Nodejs学习笔记(十五)—Node.js + Koa2 构建网站简单示例

    前言 前面一有写到一篇Node.js+Express构建网站简单示例:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp.html 这篇还 ...

  5. NodeJS学习笔记 进阶 (12)Nodejs进阶:crypto模块之理论篇

    个人总结:读完这篇文章需要30分钟,这篇文章讲解了使用Node处理加密算法的基础. 摘选自网络 Nodejs进阶:crypto模块之理论篇 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速 ...

  6. Nodejs学习笔记(四)——支持Mongodb

    前言:回顾前面零零碎碎写的三篇挂着Nodejs学习笔记的文章,着实有点名不副实,当然,这篇可能还是要继续走着离主线越走越远的路子,从简短的介绍什么是Nodejs,到如何寻找一个可以调试的Nodejs ...

  7. Nodejs学习笔记(二)——Eclipse中运行调试Nodejs

    前篇<Nodejs学习笔记(一)——初识Nodejs>主要介绍了在搭建node环境过程中遇到的小问题以及搭建Eclipse开发Node环境的前提步骤.本篇主要介绍如何在Eclipse中运行 ...

  8. 20145330第七周《Java学习笔记》

    20145330第七周<Java学习笔记> 第十三章 时间与日期 认识时间与日期 时间的度量 GMT(格林威治标准时间):现在不是标准时间 世界时(UT):1972年UTC出来之前,UT等 ...

  9. NodeJS学习笔记之Connect中间件模块(一)

    NodeJS学习笔记之Connect中间件模块(一) http://www.jb51.net/article/60430.htm NodeJS学习笔记之Connect中间件模块(二) http://w ...

随机推荐

  1. IOS UIwebview 背景色调整

    自定义webview背景色  重点是把webview弄成透明的 然后把self.view的背景调色即可 UIWebview 背景透明处理 让 UIWebView 背景透明需要以下设置 web_abou ...

  2. 如何写出好的Java代码?

    1. 优雅需要付出代价.从短期利益来看,对某个问题提出优雅的解决方法,似乎可能花你更多的时间.但当它终于能够正确执行并可轻易套用于新案例中,不需要花上数以时计,甚至以天计或以月计的辛苦代价时,你会看得 ...

  3. How to make remote key fob for 2002 BMW 3 series

    Here share with you on how to make remote key fob for 2002 BMW 3 series: Method 1: 1. Working within ...

  4. C# PageLayoutControl的基本操作

    来自:http://www.cnblogs.com/shenchao/p/3594394.html using System; using System.Collections.Generic; us ...

  5. 【阿里云产品公测】大数据下精确快速搜索OpenSearch

    [阿里云产品公测]大数据下精确快速搜索OpenSearch 作者:阿里云用户小柒2012 相信做过一两个项目的人都会遇到上级要求做一个类似百度或者谷歌的站内搜索功能.传统的sql查询只能使用like ...

  6. Java Script基础(二) 基本语法

    一.变量的声明和使用 JavaScript是一种弱类型的语言,没有明确的数据类型,在声明变量时,不需要指定变量的类型,变量的类型由赋给变量的值决定. 变量声明的语法: var 变量名; 示例: var ...

  7. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '

    mysql中如果字段使用了关键字,在插入和更新时会提示 You have an error in your SQL syntax; check the manual that corresponds ...

  8. [转]在PHP语言中使用JSON

    本文转自:http://www.ruanyifeng.com/blog/2011/01/json_in_php.html 作者: 阮一峰 日期: 2011年1月14日 目前,JSON已经成为最流行的数 ...

  9. Mac下kernel_task占用大量CPU怎么办?

    我们都知道要想让电脑运行的快速,那么就要尽量的保持内存和CPU的充足.不过一些MAC用户发现MAC系统中的Kernel_task会占用大量的CPU,导致电脑发热变卡.这个问题该怎么解决呢? 具体操作步 ...

  10. jQuery中的事件与动画<思维导图>

    Javascript和HTML之间的交互是通过用户和浏览器操作页面时引发的事件来处理的.当文档或者它的某些元素发生某些变化或操作时,浏览器会自动生成一个事件.例如当浏览器装载完一个文档后,会生成事件. ...