2

创建简单应用

  • 使用 require 指令来载入 http 模块

var http = require("http");
  • 创建服务器

使用 http.createServer() 方法创建服务器,并使用 listen 方法绑定 8888 端口。 函数通过 request,
response 参数来接收和响应数据

http.createServer(function (request, response) {

    // 发送 HTTP 头部 
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});

    // 发送响应数据 "Tangkang is a boy"
    response.end('Tangkang is a boy\n');
}).listen(8888);
  • 运行脚本

此时端口已经开启监听,等候http请求

clipboard.png

clipboard.png

NPM管理工具

NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题

使用npm可以安装别人的代码 也可以发布自己的代码到npm服务器

  • 全局安装和本地安装

本地安装

将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行
npm 命令的目录下生成 node_modules 目录。 可以通过 require() 来引入本地安装的包。

全局安装

将安装包放在 /usr/local 下。
可以直接在命令行里使用。
不能通过 require() 来引入本地安装的包。

  • 使用npm安装本地express包

$ npm install express

express 包就放在了工程目录下的 node_modules 目录中

var express = require('express'); #代码中直接使用

clipboard.png

npm install express -g # 全局安装
clipboard.png

  • 查看所有安装包

$ npm ls  查看本地安装包

clipboard.png

$ npm ls -g 查看全局安装包

clipboard.png

$ npm uninstall express 卸载模块
$ npm update    express 更新模块
$ npm search    express 搜索模块

Node.js REPL(交互式解释器)

其中下划线 _ 获取表达式变量

clipboard.png

Node.js 回调函数

  • 阻塞执行

脚本阻塞执行 文件读取完毕 才执行下一步

var fs = require("fs");

var data = fs.readFileSync('./nodejs/t.txt'); // 读取文件内容

console.log(data.toString());
console.log("输出完毕");

clipboard.png

  • 非阻塞执行

脚本非阻塞执行 不需要文件读取完毕就能执行下一步

var fs = require("fs");
fs.readFile('./nodejs/t.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});
console.log("输出完毕")

Node.js 事件循环

Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发
Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求
所有的事件基于观察者模式 接到请求就触发

  • 事件实例

    // 引入 events 模块
    var events = require('events');
    
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);
    
    // 触发事件
    eventEmitter.emit('eventName');
  • 读取文件

var fs = require("fs");

fs.readFile('login.html', function (err, data) {
    if (err){
        console.log(err.stack);
        return;
    }
    console.log(data.toString());
});
console.log("程序执行完毕");

Node.js EventEmitter

  • EventEmitter 类

events 模块只提供了一个对象: events.EventEmitter。EventEmitter
的核心就是事件触发与事件监听器功能的封装。 你可以通过require("events");来访问该模块。

同一个时间可以绑定多次 触发时候可以触发多次
var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('sayLove', function(arg1, arg2) {
    console.log('我爱你但是我没钱', arg1, arg2);
});
emitter.on('sayLove', function(arg1, arg2) {
    console.log('我没钱我也不爱你', arg1, arg2);
});
emitter.emit('sayLove', '我爱你', '你爱我');
  • error 事件

var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.emit('error');

Node.js Buffer(缓冲区)

  • 创建 Buffer 类

var buf = new Buffer(10);// 建立空数组

var buf = new Buffer([10, 20, 30, 40, 50]);// 给定数组创建buffer

var buf = new Buffer("smudge", "utf-8"); // 字符串创建buffer
  • 写入缓冲区

返回实际写入的大小

buf = new Buffer(256);
len = buf.write("smduge");
console.log("写入字节数 : "+  len);

clipboard.png

  • 缓冲区读取数据

buf = new Buffer(26);
for (var i = 0 ; i < 26 ; i++) {
    buf[i] = i + 97;
}

console.log( buf.toString('utf8',0,5));    // 输出: abcde
  • 将 Buffer 转换为 JSON 对象(类似php数组转JSON)

var buf = new Buffer(5); // 5个随机数
var json = buf.toJSON(buf);

console.log(json);

clipboard.png

  • 缓冲区合并(类似php合并数组)

var confession = new Buffer('我爱你!');
var reject = new Buffer('我们还是好朋友');
var cothurnus = Buffer.concat([confession,reject]);
console.log(cothurnus.toString());
  • 缓冲区比较

var buffer1 = new Buffer('ABC');
var buffer2 = new Buffer('ABCD');
var result = buffer1.compare(buffer2);
console.log(result); // -1 buffer1 在 buffer2 之前
  • 缓冲区拷贝(类似PHP数组赋值)

var buffer1 = new Buffer('ABC');
// 拷贝一个缓冲区
var buffer2 = new Buffer(3);
buffer1.copy(buffer2);
console.log("buffer2 content: " + buffer2.toString());
  • 缓冲区裁剪(类似PHP数组分割)

var buffer1 = new Buffer('smudge');
// 剪切缓冲区
var buffer2 = buffer1.slice(0,3);
console.log("buffer2 content: " + buffer2.toString()); // smu
  • 缓冲区长度(类似PHP数组长度)

var name = new Buffer('smudge');

console.log(name.length); // 6

Node.js Stream(流)

Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个Stream,还有stdout(标准输出)。

  • Node.js,Stream 有四种流类型

Readable - 可读操作。
Writable - 可写操作。
Duplex - 可读可写操作.
Transform - 操作被写入数据,然后读出结果。

  • Stream 对象都是 EventEmitter 的实例

data - 当有数据可读时触发。

end - 没有更多的数据可读时触发。

error - 在接收和写入过程中发生错误时触发

finish - 所有数据已被写入到底层系统时触发

  • 从流中读取数据

var fs = require("fs");

var string = '';

// 创建可读流
var readerStream = fs.createReadStream('smudge.txt');

// 设置编码
readerStream.setEncoding('UTF8');

// 处理流事件 --> data, end, and error
readerStream.on('data', function(chunk) {
    string += chunk;
});

readerStream.on('end',function(){
    console.log(string);
});

readerStream.on('error', function(err){
    console.log(err.stack);
});
  • 写入流

var fs = require("fs");
var data = '对我来说打发时间的方式只有一个抱着你睡觉';

// 创建一个可以写入的流,写入到文件 output.txt 中
var writerStream = fs.createWriteStream('love.txt');

// 使用 utf8 编码写入数据
writerStream.write(data,'UTF8');

// 标记文件末尾
writerStream.end();

// 处理流事件 --> data, end, and error
writerStream.on('finish', function() {
    console.log("写入完成。");
});

writerStream.on('error', function(err){
    console.log(err.stack);
});
  • 管道流

管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。
实现了大文件的复制过程

var fs = require("fs");

// 创建一个可读流
var readerStream = fs.createReadStream('love.txt');

// 创建一个可写流
var writerStream = fs.createWriteStream('smduge.txt'); // 存在同名文件也会新建文件

// 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readerStream.pipe(writerStream);

console.log("程序执行完毕");
  • 链式流

链式是通过连接输出流到另外一个流并创建多个对个流操作链的机制。链式流一般用于管道操作。

var fs = require("fs");
var zlib = require('zlib');

// 压缩 input.txt 文件为 input.txt.gz
fs.createReadStream('smudge.txt')
    .pipe(zlib.createGzip())
    .pipe(fs.createWriteStream('smudge.txt.gz'));

console.log("文件压缩完成。");

声明

文章全部来自 http://www.runoob.com/nodejs/nodejs-tutorial.html 我只是自己精读一遍 顺便做了这个笔记


Julylovin
980 声望54 粉丝

南京PHP工程师一枚