node.js学习随笔

Node的文件和文件系统API位于fs模块中;

var fs=require("fs")//加载文件系统API

同步读取文件,通过传递编码获得文本而非字节;

var text = fs.readFileSync("config.json","utf-8");

异步读取二进制文件,通过传递函数获得数据

fs.readFile("image.png",function(err,buffer){
if(err)throw err;//如果出现任何错误;
process(buffer);//文件内容在缓存区
});
用读写文件流api实现文件复制
function fileCopy(filename1,filename2,done){
var input = fs.createReadStream(filename1);//读输入流
var output = fs.createWriteStream(filename2);//写输出流
input.on("data",function(d){output.write(d)});//把输入复制到输出
input.on("error",function(err){throw err;});//提示错误;
input.on("end",function(){
output.end();//关闭输出
if(done)done();//并通知回掉函数;
});
}
net 模块是用于基于TCP网络的API
node中简单的TCP服务器;
//node中简单的tcp 回显服务器;它监听2000端口上的连接
//并把客户端的数据回显给他
var net = equire("net");
var server = net.createServer();
server.listen(2000,function(){console.log("Listening on port 2000");});
server.on('connection',function(stream){
console.log("Accepting connection from",stream.remoteAddress);
stream.on('data',function(data){stream.write(data);});
stream.on("end",function(data){console.log("Connextion closed");});
});
//创建 HTTP服务
使用了node的http模块
var http = require("http");
var fs = require("fs");

node.js权威指南学习!!!

1.什么时node.js框架 为什么要选择node.js框架进行服务器的开发
,使用node.js能解决什么问题?它适合用于开的那些应用程序

2.13-15章分别阐述在使用node.js框架的进行web服务器端的开发时极
可能用到第三方的开发包,如何使用关系型数据库及nosql型数据库
。。如何使用express框架开发web应用程序,如何使用socket.io类库
实现websocket通信。
3.16章综合案例结合node.js与express框架制作一个web应用程序的
服务器端与客户端

一。。Node.js概述

1.使用Node.js能解决什么问题

在web应用程序中,一个主要的瓶颈是服务器所支持的最大同时
连接用户量
Node.js修改了客户端到服务端的连接方法,解决了这个问题,它为每个客户端
连接触发一个在Node.js内部处理的事件,所以,使用Node.js能处理web应用程序
支持大量用户的并发连接的时候,我们已你改改考虑使用node.js

2.实现高性能的服务器

严格来说Node.js是一个用于开发各种web服务器的开发工具。在node.js服务器中
运行的是高性能的V8 javascript脚本语言,可以运行在服务器的javascript脚本语言
3.非阻塞型I/O及事件环机制

为了实现高性能,node.js采用了以下两种机制
非阻塞性i/o,,事件环
javascript 的特性是它只支持单线程,V8 javascript 脚本语言也是。所以 不用担心它
会造成死锁现象,与客户端脚本语言不同的是,Node.js中为V8javascript脚本语言提供了
非阻塞型I/O机制。
4.node.js适合开发的应用程序

聊天服务器
综合服务类网站或电子商务网站的服务器
a.安装Node.js
下载node.js对应版本
执行文件为:node.exe
b.node.js中的模块
客户端可以将javascript代码分割为几个js文件,然后在浏览器中将这些文件合并
,在Node.js中以模块为单位划分功能,每个模块为一个js文件
每个模块中点定义的全局变量或函数的作用范围也被限定在这个模块之间
,只有使用exports对象才将其传递到外部,代码如下所示;

exports.printFoo=function(){return "foo"}

我们可以使用exports对象使模块外部可以访问这个prntFoo函数

在引用模块模块时,我们需要使用require函数,例如将上面的printFoo函数的模块文件
保存为foo.js文件之后,可以通过如下的代码来访问模块的printFoo和NSHU

var foo=require('./foo.js');//通过foo.js文件路径加载foo.js
console.log(foo.printFoo());

var http = require('http');
http.createServer(function(req,res){
res.writeHead(200,{'Content-Type':'text/html'});
res.write('<head> <meta charset="utf-8"/></head>');
res.end('你好 ');
}).listen(1337,"127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');
2.node.js交互式运行环境-REPL
2.1 REPL运行环境概述
在命令行中,输入‘node’命令并按下回车键,即可进入repl运行环境

,命令行窗口中将会显示repl运行环境的提示符(默认为“>”)
2.2在REPL运行环境中操作变量
可使用var 关键字来定义一个变量并为其赋值,但在输入为其赋值进行的表达式后,该表达式的执行结果将
被显示为undefined

2.3在REPL运行环境中使用下划线字符
在repl运行环境中可以通过输入下划线_的方式来代替上次输入的
表达式,通过执行后不改变原变量的值,

也可以通过输入下划线的方式来访问最近一次表达式执行结果的属性或
对其执行方法;
2.4在REPL运行环境中直接运行函数
可分为多行书写
3.node.js基本知识

3.1 Node.js中的控制台
在Node.js中,用console对象代表控制台

3.1.1 console.log的方法

console.log方法用于进行标准流的输出,既在控制台中显示一行字符串
,代码如下
console.log("This is a test string")

标准输出流可重新定向 输出到新的文件中
node app.js 1>info.log
1代表重新定向
在Node.js中,可以用console.info方法代替console.log方法
方法的作用与使用方法完全相同

3.1.2 console.erroe方法

用于输出标准的错误流
标准错误流可重新定向 输出到新的文件中
node app.js 2>error.log
2代表重新定向标准错误流
3.1.3 console.dir

用于查看一个对象中的内容并且将该对象的信息输出到控制台

3.1.4 console.time 与console.timeEnd方法

在node.js中,当需要统计一段代码的执行时间时,可使用console
.time方法于console.timeEnd方法,console.time方法用于标记
开始时间 console.timeEnd方法用于标记结束时间,并将结束时间于开始
时间之间经过的毫秒数在控制台输出
console.time(label)
console.timeEnd(label)
参数值可以为任意的字符串 但必须相同

console.time('small loop')
for(var i=0; i<100000;i++){
;
}
console.timeEnd('small loop');
3.1.5 console.trace 方法
此方法 用于将当前位置处的栈信息作为标准错误信息进行输出
console.trace("label");
3.2 Node.js 中的全局作用域与全局函数
3.2.1 node.js中的全局作用域

在Node.js中有一个global对象。代表Node.js走的全局命名空间,
任何全局变量,函数或对象都是该对象的一个属性值,
3.2.2 setTimeout函数与clearTimeout函数

Node.js 中的setTimeout全局函数的作用与客户端javascript
脚本代码中的settime函数类似,在当前时刻过去多少毫秒之后执行
某个回掉函数,具体延时时间取决于外部因素,例如操作系统的时间粒度
3.2.3 与模块相关的全局函数及对象

1.使用require函数加载模块

var foo =require('../foo.js');
var http=require('http');
require 函数使用一个参数,参数值可以为带有完整路径的弄块文件名
也可以为模块名。
在node.js中,所有的脚本文件都是一个模块文件
在Node.js中将该模块文件所定义的模块称之为应用程序的主模块

2.使用require.resolve函数查询完整模块名

在node.js中可以使用require.resolve函数来查询
某个模块文件的带有完整绝对路径的文件名。代码如下
require.resolve('./testMoudle.js')
3.3 _filename变量与_dirname变量
用于获取当前模块文件名的_filename变量与用于
获取当前目录名 的_dirname变量
var http = require('http');
var server=http.createserver();
server.on('request',function(req,res){
console.log(req.url);
res.end();
});
ver.listen(1337,'127.0.0.1');
3.4 在命令窗口中使用调试器
console.log('hello,world');
function foo(){
console.log('hello,foo');
return 100;
}
var bar = 'this is a pen.';
var http=require('http');
var i = foo();
console.log(i);

续//
3.5.4 调试器中可以使用的其他使用命令
1. backtrace 命令
var i=0;
var func1=function(){
var func2=function(){
var func3=function(){
var func4=function(){
var func5=function(){
i=i+1;
}
func5();
}
func4();
}
func3();
}
func2();
}
func1();
console.log(i);
3.5.5 使用node-inspector调试工具
npm install -g node-inspector

第四章 模块与npm包管理工具

4.1.核心模块与文件模块

Node.js应用程序由大量的模块组成,
模块(js脚本文件);
用模块的名字做require函数的参数

require('http');
在node.js中也可自己编写或下载以下几种模块文件
1。后缀为.js的javascript的脚本文件
2. 后缀为.json的JSON的文本文件
3. 后缀为.node的经过编译后的二进制模块文件

加载时需要指定相应的路径
require('./script/foo.js')

4.2 从模块外部访问模块的成员

4.2.1.使用exports对象

在一个模块文件中定义的本地(即非函数内定义的)变量。函数或对象只在
该模块内有效,当从模块外部引入这些变量。函数或对象时,需要在该
模块文件内使用exports对象;

var myMsg='hello';

var funcname=function(){
return 'I'm funcname1 function.;
}
exports.msg=myMsg;
exports.funcname=funcname;
上文件保存为foo.js

var foo=require('./foo.js');
console.log(foo.msg);
console.log(foo.funcname);
4.2.2 将模块定义为类
可在模块文件内将exports对象书写为'module.exports'
但是在需要将模块定义为一个类时,只能使用'module.exports'
定义一个foo类‘

var _name,_age;
var name='',age=0;
//模块对象的构造函数
var foo=function(name,age){
_name=name;
_age=age;
}
//获取私有变量_name的变量值
foo.prototype.GetName=function(){
return _name;
};
//设置私有变量_name的变量值
foo.prototype.SetName=function(){
_name=name;
};
//获取私有变量_age的变量值
foo.prototype.GetAge=function(){
return _age;
};
//设置私有变量_age的变量值;
foo.prototype.SetAge=function(){
_age=age;
};
foo.prototype.name=name;
foo.prototype.age=age;
module.exports=foo;
4.3 组织与管理模块
4.3.1 从node_modules目录中加载模块

require('bar.js')
4.3.2 使用目录来管理模块

在node.js中可以将目录名制定为模块命,以便可以通过目录来管理模块,只需为该目录指定一个入口

//var foo=require('./foo.js')修改如下

var foo = require('foo');
用 node app.js 命令

4.5包 与npm包管理工具

node.js中的包
在node.js中,可以通过包来对一组具有相互依赖关系的模块进行统一管理

通过包的使用,我们可以将某个独立的功能封装起来;

第 5章 使用Buffer类处理二进制数据

1.创建Buffer对象
在node.js中。Buffer类时一个可以在任何模块中被利用的全局类,不需用为
该类的使用加载任何模块,可以使用NEW关键子来创建该类的对象
有三种形式的构造函数

new Buffer(size)
创建的对象有一个length属性,属性值为缓存区大小

在REPL环境中输入一些命令以创建Buffer对象并查看缓存区的大小

可以使用buffer对象的fill方法来初始化缓存区中的所有内容

buf.fill(value,[offset],[end])
第一个参数必须有 为被写入的参数的数值
第二个与第三个可选,第二个为指定从第几个字节处开始写入被指定的数值
,默认为0,即从缓存区的其实位置开始,3个用于指定将数值
一直写入到第几个字节,默认值为Buffer对象的大小,即书写到缓存区底部
2 Buffer类的第二中形式的构造函数是直接使用一个数组来初始化缓存区
new Buffer(array)使用一个存放了需要被指定数值的数组来所为构造函数的参数

3.Buffer类的第三种形式的构造函数是直接使用一个字符串来初始化缓存区
代码如下
new Buffer(str,[encoding])
参数 第一个为必须指定的参数,参数值为用于初始化缓存区的字符串,第二个参数值为一个用于
制定文字编码格式的字符串,默认值为‘utf-8’
5.2 字符串的长度与缓存区的长度

不相同
计算字符串的长度以文字作为单位,计算缓存区的长度,以字节
作为单位
在字符串中获取的长度为索引对应的值,而在buffer中获取到的值是缓存区中第三个字节数据转换为是整数后的数值

!!字符串对象一旦被创建就不能被修改
Buffer对象可以被修改
修改对应的数值
Buffer类的类方法

1 isBuffer方法

判断一个对象是否为一个Buffer对象,

Buffer.isBuffer(obj);
其中的参数用于指定需要被判断的对象,如果对象为Buffer对象
返回true 否则fanhui false
第六章 在Node.js中操作文件系统

6.1 同步方法与异步方法
使用fs模块来对所有的文件及目录创建,写入及删除操作

var fs=require('fs');
var data= fs.readFileSync('./index.html','utf8');
//等待返回结果,然后利用该结果
console.log(data);
异步方法
var fs=require('fs');
fs.readFile('./index.html','utf8',function(err,data){
//操作结果作为回掉函数的第二参数返回
console.log(data)
});
同时读取多个文件时不能确定那个文件(顺序)先读取出来 取决于读取完成所花费
的时间,
可以在读取文件时在会点函数中读取另外一个文件;
6.2对文件执行读写操作

6.2.1 文件的完整读

fs.readFile(filename,[options],callback)其中第一个参数和第二个参数为必须指定的参数

中间的参数默认值位‘r’指定对文件使用flag属性采取什么操作

var fs = require('fs');
fs.readFile('./test.txt',function(err,data){
if(err){
console.log('读取文件时发生错误');
else{
console.log(data);
}
}
});
在完整写入一个文件时,可以用fs模块提供的writeFile方法或writeFileSync方法

fs.writeFile(filename,data,[options],callback)

其中1,2,4参数为必须指定的参数,3个参数指定对该文件表示用于指定
对该文件采取何种操作,默认值位'w'
var fs=require('fs');
fs.writeFile('./message.txt','这是第一行。 这是第二行',function(err){
if(err){
console.log('写文件操作失败');
})else{
console.log('写文件操作成功');
}
});
!!!! 使用ReadStream对象读取文件
fs.createReadStream(path,[options])

//续第七章

第七章 实现基于TCP与UDP的数据通信

7.1 使用net模块实现基于TCP的数据通信

使用net模块,专用于实现TCP服务器与TCP客户端之间的通信

7.1.1创建TCP服务器

var server= net.createServer([options],[connectionListener])
1参数为一个对象,该属性的默认值为false
2参数用于指定当客户端与服务端建立连接所要 调用的
回掉函数
function(socket){
//函数体
}
其中的参数值为该TCP服务器监听的socket端口对象
在创建了TCP服务器后,可以使用listen方法通知服务器开始监听客户端
连接。该方法具有如下所示的三种指定方法
server.on('connection',function(socket){
//毁掉函数代码略
})
方法1
server.listen(port,[host],[backlog],[callback])//server代表一个TCP服务器
方法2
server.listen(path,[callback]);//server代表一个使用unix端口的服务器
方法3
server.listen(handle,[callback]);//TCP
使用getConnections(callback)方法来查看与服务器连接数的多少
!!使用
server.close([callback])
方法显示指定服务器拒绝所有新的客户端连接

7.1.2 socket端口对象
var net=require('net');
var server =net.createServer(function(socket){
address=socket.address();
console.log('socket端口对象的地址信息位%j',address);
});
server.listen(8431,'localhost');
socket端口对象可以用来读取客户端发送的流数据,接收到数据时触发
data事件,可通过对该事件进行监听并且制定回掉函数的方法来指定当服务器
监听的socket端口对象接受到客户端发送的数据时所执行的处理
socket.on('data',functio(data){
console.log(data);
});
使用socket对象的setEncoding方法
socket.setEncoding('utf8');
socket.on('data',function(data){
console.log(data)
})
使用Buffer对象的toString方法
socket.on('data',fucntion(data){
console.log(data.toString());
})

可以用socket对象的pipe方法将客户端发送的流数据书写到文件
等其他目标对象中,
socket.pipe(destination,[options]);
其中1参数为 必选的,2为可选(加end为false 在后面追加数据)
使用socket对象的unpipe方法取消对文件写的操作
socket.unpipe(file);
4 使用socket对象的pause方法暂停data事件的触发,此时服务器端将把每一个客户端发送的数据暂存在一个
单独的缓存区中。
socket.pause();
5 可以使用如下方法 对socket对象设置超时时间
socket.setTimeout('timeout',function(){
//LUE
})
7.1.3 创建TCP客户端

创建一个用于连接TCP服务器的socket端口对象即可
var net = new net.Socket([options]);
options为可选参数
值为 fd 用于指定一个现存的socket的文件描述符TCP客户端将使用这个现存的socket端口与
服务器端相连接

7.2 使用dgram模块实现基于UDP的数据通信
Node.js中提供了dgram模块,用于创建UDP服务器和客户端,以及实现UDP服务器与客户端的
通信.

7.2.1创建UDP服务器与客户端

方法如下;
var socket = dgram.createSocket(type,[callback])

type参数为必须输入的参数 callback为可选参数
type用于指定进行UDP通信的使用协议类型 可制定值为'upd4'或‘upd6’
第八章 创建HTTP与HTTPS服务器与客户端
8.1 HTTP服务器
8.1.1创建HTTP服务器
var server = http.createServer([requestListener])
//指定客户端与服务端建立连接时的处理
server.on('connection',function(socket){
//lue
})
设置超时时间
server.on('timeout',function(socket){
//lue
})
server.timeout=1000;
console.log(server.timeout)
8.1.2获取客户端请求信息
var http = require('http');
var server = http.creataServer(function(req,res){
if(req.url!=="/favicon.ico"){
req.on('data',function(data){
console.log('服务器端接受到的收据:'+data);
res.end();
});
}
}).listen(1337,'127.0.0.1');
8.2.3 制作代理服务器

先创建一个HTTP服务器,当服务器接收到客户端的请求后
向网站请求数据,当从网站接受到响应数据后,将响应数据发送给给
客户端

原文地址:https://www.cnblogs.com/johnny-cli/p/7524925.html