node

作者 新城 日期 2017-09-13
node

百度安装node

新建项目

根目录新建server.js

1
2
3
4
5
6
7
var http = require('http'); //引入http模块
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});// 发送 HTTP 头部 // HTTP 状态值: 200 : OK// 内容类型: text/plain
response.end('Hello World\n'); // 发送响应数据 "Hello World"
}).listen(8888);

console.log('Server running at http://127.0.0.1:8888/'); // 终端打印如下信息

当前目录打开命令行 运行node server.js

1
2
F:\Createwj.github.io\source\node\1>node server.js
Server running at http://127.0.0.1:8888/

在浏览器打开 http://127.0.0.1:8888/

express

安装express框架

1
npm install express

文件读取

阻塞代码例子

1
2
3
4
var fs = require("fs"); //文件读写
var data = fs.readFileSync('input.txt'); //读取文件名称
console.log(data.toString()); //转化为字符串
console.log("Program Ended");

非阻塞代码例子

1
2
3
4
5
6
7
8
var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});

console.log("Program Ended");

非阻塞的时候先输出Program Ended 在输出文件读取内容 异步 适合高并发’

Node.js事件循环参考

Node JS是单线程应用程序,但它通过事件和回调概念,支持并发。
由于Node JS每一个API是异步的,作为一个单独的线程,它使用异步函数调用,以保持并发性。

在事件驱动的应用中,通常主循环监听事件,然后触发回调函数时被检测到这些事件之一。



Node.js事件发射器

EventEmitter 类

1
2
3
4
// Import events module
var events = require('events');
// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

EventEmitter实例对任何错误,它会发出一个“error”事件。当新的侦听器被添加,“newListener’事件被触发,当一个侦听器被删除,’removeListener”事件被触发。

EventEmitter提供多种性能如在发射。On属性用于绑定事件函数,发射用于触发一个事件。

Node.js缓冲器

纯JavaScript是Unicode友好的,但对二进制数据不是很好。当与TCP流或文件系统打交道时,有必要处理字节流。 Node提供缓冲器类,它提供实例来存储原始数据相似的一个整数数组,但对应于在V8堆外的原始存储器的分配。

Buffer类是一个全局类,可以在应用程序,导入缓冲模块进行访问。
创建缓冲区

1
2
3
4
5
var buf = new Buffer(10);   //创建10个字节的汉缓冲的语法:

var buf = new Buffer([10, 20, 30, 40, 50]); //给定数组创建一个缓冲区的语法:

var buf = new Buffer("Simply Easy Learning", "utf-8"); //给定的字符串和可选的编码类型创建缓冲区的语法:

写到缓冲器

1
buf.write(string[, offset][, length][, encoding])  //写入到一个节点缓冲器的方法的语法:

  • string - 这是要被写入的数据串缓冲区。

  • offset - 这是缓冲区开始的索引。默认值为0。

  • length - 这是要写入的字节的数目。默认是 buffer.length

  • encoding - 编码使用。 “UTF8”是默认的编码

从缓冲器读取

1
buf.toString([encoding][, start][, end])

-encoding - 编码使用。 “UTF8”是默认的编码

  • start - 开始读取的索引,默认为0。
  • end - 最终读数结束的索引,默认值是整个缓冲区。

转换缓冲到JSON

1
buf.toJSON()

执行

1
2
3
4
var buf = new Buffer('Simply Easy Learning');
var json = buf.toJSON(buf);

console.log(json);

输出
[ 83, 105, 109, 112, 108, 121, 32, 69, 97, 115, 121, 32, 76, 101, 97, 114, 110, 105, 110, 103 ]

接续缓冲器
以下是连接Node缓存到单个节点缓存方法的语法:

1
Buffer.concat(list[, totalLength])

参数

  • list -要连接缓冲区的数组对象列表

  • totalLength - 这是缓冲器连接在一起时的总长度

    示例

    1
    2
    3
    4
    var buffer1 = new Buffer('YiiBai ');
    var buffer2 = new Buffer('Simply Easy Learning');
    var buffer3 = Buffer.concat([buffer1,buffer2]);
    console.log("buffer3 content: " + buffer3.toString());

输出
buffer3 content: YiiBai Simply Easy Learning

比较缓冲器

下面是比较两个Node缓冲器的方法的语法:

1
buf.compare(otherBuffer);

otherBuffer - 这是将与被比较的其它缓冲 buf

示例

1
2
3
4
5
6
7
8
9
10
11
var buffer1 = new Buffer('ABC');
var buffer2 = new Buffer('ABCD');
var result = buffer1.compare(buffer2);

if(result < 0) {
console.log(buffer1 +" comes before " + buffer2);
}else if(result == 0){
console.log(buffer1 +" is same as " + buffer2);
}else {
console.log(buffer1 +" comes after " + buffer2);
}

输出 ABC comes before ABCD

复制缓存区

1
buf.copy(targetBuffer[, targetStart][, sourceStart][, sourceEnd])

  • targetBuffer - 缓冲区对象的缓冲区将被复制。
  • targetStart - 数量,可选,默认:0
  • sourceStart - 数量,可选,默认:0
  • sourceEnd - 数量,可选,默认:buffer.length

返回值
没有返回值。拷贝数据从该缓冲器的一区域中,即使在目标内存区域与源重叠的目标缓冲器的区域。如果不确定targetStart,那么sourceStart参数默认为0,sourceEnd默认为buffer.length
示例

1
2
3
4
5
var buffer1 = new Buffer('ABC');
//copy a buffer
var buffer2 = new Buffer(3);
buffer1.copy(buffer2);
console.log("buffer2 content: " + buffer2.toString());

输出 buffer2 content: ABC

缓存区长度

1
2
3
var buffer = new Buffer('YiiBai');
//length of the buffer
console.log("buffer length: " + buffer.length);