七天学会NodeJS-学习笔记
在网上发现一篇nodeJS教程,名为七天学会NodeJS,标题很有吸引力。我不指望七天能学会,只希望可以入门,下面是我的学习笔记和遇到的问题。
教程网址:http://nqdeng.github.io/7-days-nodejs/
系统环境:virtualBox ubuntu 14.10
nodeJS版本:0.10.35
一、安装
我使用过三种方法来安装nodeJS,分别是二进制文件、apt-get命令和编译安装。
- 从官网下载对应系统的二进制文件,双击安装。网站:http://www.nodejs.org/download/
- 在ubuntu下使用命令apt-get安装,命令如下:
sudo apt-get install nodejs sudo apt-get install npm
- 从官网下载源码,编译安装。我参考了博客园的一篇文章,地址:http://www.cnblogs.com/hwpayg/archive/2012/11/04/2753404.html
二、模块
在nodeJS中,一般会将代码模块化。在编写模块时,一般会用到三个变量:require、exports、module。
- 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'); - exports是导出对象,用于导出当前模块中的公有方法与属性,在其他模块中使用require得到的就是exports对象。下面的例子导出了一个公有方法
exports.hello = function () { console.log('Hello World!'); }; - 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环境中,我们可以做如下配置:
- 在js文件顶部插入代码 #! /usr/bin/env node ,用于指定当前脚本的解析器。
- 赋予js代码文件执行权限 chmod +x /home/user/bin/node-echo.js
- 创建软链: 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基本可以分为三类:
- 文件属性操作,如:fs.stat fs.chmod fs.chowd
- 文件内容操作,如:fs.readFile fs.readdir fs.writeFile fs.mkdir
- 底层文件操作,如: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-学习笔记的更多相关文章
- Nodejs学习笔记(三)——一张图看懂Nodejs建站
前言:一条线,竖着放,如果做不到精进至深,那就旋转90°,至少也图个幅度宽广. 通俗解释上面的胡言乱语:还没学会爬,就学起走了?! 继上篇<Nodejs学习笔记(二)——Eclipse中运行调试 ...
- Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...
- [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...
- Nodejs学习笔记(十五)—Node.js + Koa2 构建网站简单示例
前言 前面一有写到一篇Node.js+Express构建网站简单示例:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp.html 这篇还 ...
- NodeJS学习笔记 进阶 (12)Nodejs进阶:crypto模块之理论篇
个人总结:读完这篇文章需要30分钟,这篇文章讲解了使用Node处理加密算法的基础. 摘选自网络 Nodejs进阶:crypto模块之理论篇 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速 ...
- Nodejs学习笔记(四)——支持Mongodb
前言:回顾前面零零碎碎写的三篇挂着Nodejs学习笔记的文章,着实有点名不副实,当然,这篇可能还是要继续走着离主线越走越远的路子,从简短的介绍什么是Nodejs,到如何寻找一个可以调试的Nodejs ...
- Nodejs学习笔记(二)——Eclipse中运行调试Nodejs
前篇<Nodejs学习笔记(一)——初识Nodejs>主要介绍了在搭建node环境过程中遇到的小问题以及搭建Eclipse开发Node环境的前提步骤.本篇主要介绍如何在Eclipse中运行 ...
- 20145330第七周《Java学习笔记》
20145330第七周<Java学习笔记> 第十三章 时间与日期 认识时间与日期 时间的度量 GMT(格林威治标准时间):现在不是标准时间 世界时(UT):1972年UTC出来之前,UT等 ...
- NodeJS学习笔记之Connect中间件模块(一)
NodeJS学习笔记之Connect中间件模块(一) http://www.jb51.net/article/60430.htm NodeJS学习笔记之Connect中间件模块(二) http://w ...
随机推荐
- CSS 之 控制图片与文字对齐
文字旁边搭配图片时,发现图片比文字靠上,原来默认的情况是图片顶对齐而文字底对齐,通过设置css属性可以使得图片与文字对齐. 设置各对象的vertical-align属性,属性说明: baseline- ...
- Redis操作的封装类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ServiceS ...
- 【CSS3】---元素隐藏(是否占据空间、是否可点击)
在CSS中,让元素隐藏(指屏幕范围内肉眼不可见)的方法很多,有的占据空间,有的不占据空间:有的可以响应点击,有的不能响应点击. { display: none; /* 不占据空间,无法点击 */ } ...
- android 底部tabview模板
以下只是我个人的浅见,大神请忽略~ 底部tab的实现如下图: 现在实现这种界面是有很多方法的,但是对于android新手来说,实现这样的界面还是有难度的. 在网上找到了一个别人写好的底部tab模板,修 ...
- android sqlite操作(2)
以下只是我个人的浅见,大神请忽略~ 这一篇说一下sqlite的相关操作,其实安卓提供了相当多的操作sqlite的方法,这里我介绍下我常用的方法. (1)创建一个数据库文件,这个很简单 File dbP ...
- 解决$_REQUEST['name']Undefined问题
最近按照w3school一步一步学php,当学到$_REQUEST的时候,依旧按照w3cshool所提供的代码自己手敲了一遍,代码如下: <html> <body> <f ...
- Zend studio 12.5.1安装aptana
aptana是zend studio的一个插件.解决zend对于前台html支持,加亮的问题. 安装方法其实很简单 ,直接给出aptana的地址了. http://download.aptana.co ...
- php操作mysql总结
01 <?php02 $dbhost='localhost';03 $dbuser='root';04 $dbpass='123456';05 $dbname='pro ...
- jQuery 删除或是清空某个HTML元素示例
jQuery使用下面两个方法来删除或是清空某个HTML元素. remove() – 删除指定的元素(包括其子元素)empty() – 清空指定元素的子元素 1.remove() <!DOCTY ...
- iOS6定位服务编程详解
现在的移动设备很多都提供定位服务,使用iOS系统的iPhone.iPod Touch和iPad都可以提供位置服务,iOS设备能提供3种不同途径进行定位:Wifi, 蜂窝式移动电话基站, GPS卫星 i ...