资讯专栏INFORMATION COLUMN

Node.js 中度体验

CastlePeaK / 658人阅读

摘要:创建简单应用使用指令来载入模块创建服务器使用方法创建服务器,并使用方法绑定端口。全局安装将安装包放在下。的核心就是事件触发与事件监听器功能的封装。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。压缩文件为文件压缩完成。

创建简单应用

使用 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
");
}).listen(8888);

运行脚本

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

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"); #代码中直接使用

npm install express -g # 全局安装

查看所有安装包

$ npm ls  查看本地安装包

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

$ npm uninstall express 卸载模块
$ npm update    express 更新模块
$ npm search    express 搜索模块
Node.js REPL(交互式解释器)

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

Node.js 回调函数

阻塞执行

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

var fs = require("fs");

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

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

非阻塞执行

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

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);

缓冲区读取数据

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);

缓冲区合并(类似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 我只是自己精读一遍 顺便做了这个笔记

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79659.html

相关文章

  • 《2017 中国云计算评测报告》发布,各大云平台用户体验得分出炉

    摘要:首先告诉大家这份中国云计算评测报告是如何产生的,以免有读者怀疑其严谨性。根据听云此次的分值计算标准,评分结果如图上所示。云计算(Cloud Computing)从概念提出到现在已经走过了风云变幻十余载,整个产业相对成熟,同时行业集中度也越来越高,主流市场被业内众所周知的几家大公司把持。目前物联网、人工智能正处于众人追捧的风口,两者的发展都离不开云计算的加持,因此云计算服务商之间的强强对决也是...

    Shihira 评论0 收藏0
  • 龙图 VP 李翀:数据化运营及云计算下的运维

    摘要:文龙图李翀原文地址当游戏遇上大数据和云计算谈数据化运营及云计算下的运维龙图做了年的游戏,真正快速发展起来是在移动互联网这个时代。刀塔传奇遇上大数据,现在在整个运营和运维过程中,每天产生日志文件已经达到级的水平。 showImg(http://lock522.b0.upaiyun.com/%E9%BE%99%E5%9B%BEVP%20%E6%9D%8E%E7%BF%80.JPG); 文 ...

    Java_oldboy 评论0 收藏0
  • 龙图 VP 李翀:数据化运营及云计算下的运维

    摘要:文龙图李翀原文地址当游戏遇上大数据和云计算谈数据化运营及云计算下的运维龙图做了年的游戏,真正快速发展起来是在移动互联网这个时代。刀塔传奇遇上大数据,现在在整个运营和运维过程中,每天产生日志文件已经达到级的水平。 showImg(http://lock522.b0.upaiyun.com/%E9%BE%99%E5%9B%BEVP%20%E6%9D%8E%E7%BF%80.JPG); 文 ...

    JerryC 评论0 收藏0
  • IDC:2017年中国公有云服务市场超40亿美金

    摘要:报告显示,年排名前五的中国公有云厂商市场份额有所变化。此外,随着一带一路政策的发布和推进,中国企业出海需求旺盛,而成长为具有全球化视野的云服务商,也对云厂商的服务能力提出了新的要求。报告显示,2017年排名前五的中国公有云IaaS厂商市场份额有所变化。其中,阿里云继续保持市场领军位置,全年市场份额相比去年进一步提升,达到45.5%;腾讯云稳居第二,市场份额突破10% ;中国电信排名第三,同比...

    Bmob 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<