Node.js 基础库
全局对象
Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global对象的属性。
我们在 Node.js 中能够直接访问到对象通常都是 global 的属性,如 console、process.
全局变量:在最外层定义的变量, 全局对象的属性, 隐式定义的变量(未定义直接赋值的变量)。
当你定义一个全局变量时,这个变量同时也会成为全局对象的属性, 在 Node.js 中你不可能在最外层定义变量,
因为所有用户代码都是属于当前模块的,而模块本身不是最外层上下文。
process全局变量
global 对象的属性, 它用于描述当前 Node.js 进程状态的对象,提供了一个与操作系统的简单接口
输入, 输出等都是出自于这.process.stdout是标准输出流
rocess.nextTick(callback)的功能是为事件循环设置一项任务,Node.js 会在下次事件循环调响应时调用 callback.
初学者很可能不理解这个函数的作用,有什么任务不能在当下执行完,需要交给下次事件循环响应来做呢?
因为一个 Node.js 进程只有一个线程,因此在任何时刻都只有一个事件在执行。如果这个事件占用大量的 CPU 时间,
执行事件循环中的下一个事件就需要等待很久,因此 Node.js 的一个编程原则就是尽量缩短每个事件的执行时间.
process.nextTick() 提供了一个这样的工具,可以把复杂的工作拆散,变成一个个较小的事件。
console全局变量
console 用于提供控制台标准输出, 如果有多个参数,则以类似于 C 语言 printf() 命令的格式输出。
第一个参数是一个字符串,如果没有参数,只打印一个换行。
util 常用工具
util.inherits 继承
var util = require('util');
function Base() {
this.name = 'base';
this.base = 1991;
this.sayHello = function() {
console.log('Hello ' + this.name);
};
}
Base.prototype.showName = function() {
console.log(this.name);
};
function Sub() {
this.name = 'sub';
}
util.inherits(Sub, Base);
var objBase = new Base();
objBase.showName();
objBase.sayHello();
console.log(objBase);
var objSub = new Sub();
objSub.showName();
//objSub.sayHello();
console.log(objSub);
util.inspect
util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换为字符串的方法,
通常用于调试和错误输出。它至少接受一个参数 object,即要转换的对象。
var util = require('util');
function Person() {
this.name = 'byvoid';
this.toString = function() {
return this.name;
};
}
var obj = new Person();
console.log(util.inspect(obj));
console.log(util.inspect(obj, true));
运行结果是:
{ name: 'byvoid', toString: [Function] }
{ toString:
{ [Function]
[prototype]: { [constructor]: [Circular] },
[caller]: null,
[length]: 0,
[name]: '',
[arguments]: null },
name: 'byvoid' }
事件驱动 events
events 是 Node.js 最重要的模块,没有“之一”,
事件发射器
events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件发射与事件监听器功能的封装.
。EventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义,对于每个事件
EventEmitter 支持若干个事件监听器。当事件发射时,注册到这个事件的事件监听器被依次调用,
事件参数作为回调函数参数传递。
var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('someEvent', function(arg1, arg2) { // 定义事件监听
console.log('listener1', arg1, arg2);
});
emitter.on('someEvent', function(arg1, arg2) { // 定义事件监听
console.log('listener2', arg1, arg2);
});
emitter.emit('someEvent', 'byvoid', 1991); // 事件发射
运行的结果是:
listener1 byvoid 1991
listener2 byvoid 1991
常用API
EventEmitter.on(event, listener) 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数 listener。
EventEmitter.emit(event, [arg1], [arg2], [...]) 发射 event 事件,传递若干可选参数到事件监听器的参数表。
EventEmitter.once(event, listener) 为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器。
EventEmitter.removeListener(event, listener) 移除指定事件的某个监听器,listener 必须是该事件已经注册过的监听器。
EventEmitter.removeAllListeners([event]) 移除所有事件的所有监听器,如果指定 event,则移除指定事件的所有监听器。
error 事件
EventEmitter 定义了一个特殊的事件 error,它包含了“错误”的语义,我们在遇到异常的时候通常会发射 error 事件。
当 error 被发射时,EventEmitter 规定如果没有响应的监听器,Node.js 会把它当作异常,退出程序并打印调用栈.
我们一般要为会发射 error事件的对象设置监听器,避免遇到错误后整个程序崩溃.
var events = require('events');
var emitter = new events.EventEmitter();
emitter.emit('error');
运行时会显示以下错误:
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
文件系统 fs
fs 模块是文件操作的封装,它提供了文件的读取、写入、更名、删除、遍历目录、链接等 POSIX 文件系统操作。
与其他模块不同的是,fs 模块中所有的操作都提供了异步的和同步的两个版本,
例如读取文件内容的函数有异步的 fs.readFile() 和同步的fs.readFileSync()。
HTTP 服务器与客户端
Node.js 标准库提供了 http 模块,其中封装了一个高效的 HTTP 服务器和一个简易的HTTP 客户端.
http.Server 的事件
http.Server 是一个基于事件的 HTTP 服务器,所有的请求都被封装为独立的事件,
开发者只需要对它的事件编写响应函数即可实现 HTTP 服务器的所有功能。
request:当客户端请求到来时,该事件被触发,提供两个参数 req 和res,分别是http.ServerRequest 和
http.ServerResponse 的实例http.ServerResponse 的实例,表示请求和响应信息
connection:当 TCP 连接建立时,该事件被触发,提供一个参数 socket,为net.Socket 的实例
connection 事件的粒度要大于 request, 因为客户端在Keep-Alive 模式下可能会在同一个连接内发送多次请求。
close :当服务器关闭时,该事件被触发。注意不是在用户连接断开时
http.ServerRequest
http.ServerRequest 是 HTTP 请求的信息,是后端开发者最关注的内容。它一般由http.Server 的 request 事件发送,
作为第一个参数传递,通常简称 request 或 req
data :当请求体数据到来时,该事件被触发。该事件提供一个参数 chunk,表示接收到的数据
end :当请求体数据传输完成时,该事件被触发,此后将不会再有数据到来
close: 用户当前请求结束时,该事件被触发。不同于 end,如果用户强制终止了传输,也还是调用close。
获取 GET 请求内容
//httpserverrequestget.js
var http = require('http');
var url = require('url');
var util = require('util');
http.createServer(function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(util.inspect(url.parse(req.url, true)));
}).listen(3000);
在浏览器中访问 http://127.0.0.1:3000/user?name=byvoid&email=byvoid@byvoid.com,我
们可以看到浏览器返回的结果:
{ search: '?name=byvoid&email=byvoid@byvoid.com',
query: { name: 'byvoid', email: 'byvoid@byvoid.com' },
pathname: '/user',
path: '/user?name=byvoid&email=byvoid@byvoid.com',
href: '/user?name=byvoid&email=byvoid@byvoid.com' }
通过 url.parse①,原始的 path 被解析为一个对象,其中 query 就是我们所谓的 GET请求的内容,而路径则是 pathname
获取 POST 请求内容
最常见的就是 GET 和 POST, GET 请求把所有的内容编码到访问路径中,POST 请求的内容全部都在请求体中.
Node.js 默认是不会解析请求体的,当你需要的时候需要手动来做.
//httpserverrequestpost.js
var http = require('http');
var querystring = require('querystring');
var util = require('util');
http.createServer(function(req, res) {
var post = '';
req.on('data', function(chunk) {
post += chunk;
});
req.on('end', function() {
post = querystring.parse(post);
res.end(util.inspect(post));
});
}).listen(3000);
http.ServerResponse
http.ServerResponse 是返回给客户端的信息,决定了用户最终能看到的结果,它也是由 http.Server 的 request 事件发送的,
作为第二个参数传递,一般简称为response 或 res。
response.writeHead(statusCode, [headers]):向请求的客户端发送响应头
statusCode 是 HTTP 状态码,如 200 (请求成功)、404 (未找到)等
response.write(data, [encoding]):向请求的客户端发送响应内容. data 是一个 Buffer 或字符串,表示要发送的内容
response.end([data], [encoding]):结束响应,告知客户端所有发送已经完成
当所有要返回的内容发送完毕的时候,该函数 必须 被调用一次
HTTP 客户端
常用的参数如下所示。
host :请求网站的域名或 IP 地址。
port :请求网站的端口,默认 80。
method :请求方法,默认是 GET
path :请求的相对于根的路径,默认是“/”。QueryString 应该包含在其中
headers :一个关联数组对象,为请求头的内容。
Node.js 基础库的更多相关文章
- Node.js基础与实战
Node.js基础与实战 Node.jsJS高级进阶 NODE原理与解析 REPL交互环境 模块与NPM Buffer缓存区 fs文件操作 Stream流 TCP&UDP 异步编程 HTTP& ...
- Node.js基础知识
Node.js入门 Node.js Node.js是一套用来编写高性能网络服务器的JavaScript工具包,一系列的变化由此开始.比较独特的是,Node.js会假设在POSIX环境下运行 ...
- 10慕课网《进击Node.js基础(一)》初识promise
首先用最简单的方式实现一个动画效果 <!doctype> <html> <head> <title>Promise animation</titl ...
- 进击Node.js基础(二)
一.一个牛逼闪闪的知识点Promise npm install bluebird 二.Promise实例 ball.html <!doctype> <!DOCTYPE html> ...
- node.js基础模块http、网页分析工具cherrio实现爬虫
node.js基础模块http.网页分析工具cherrio实现爬虫 一.前言 说是爬虫初探,其实并没有用到爬虫相关第三方类库,主要用了node.js基础模块http.网页分析工具cherri ...
- NodeJs>------->>第三章:Node.js基础知识
第三章:Node.js基础知识 一:Node.js中的控制台 1:console.log.console.info 方法 console.log(" node app1.js 1> ...
- 07慕课网《进击Node.js基础(一)》HTTP小爬虫
获取HTML页面 var http = require('http') var url='http://www.imooc.com/learn/348' http.get(url,function(r ...
- 03慕课网《进击Node.js基础(一)》API-URL网址解析
url url.parse(url,query,host);解析域名 url必须,地址字符串 query可选 host 可选:在不清楚协议时正确解析 querystring 字符串和对象之间互相解析 ...
- 01慕课网《进击Node.js基础(一)》Node.js安装,创建例子
版本:偶数位为稳定版本,基数为非稳定版本 - 0.6.x - 0.7.x - 0.8.x -0.9.x -0.10.x -0.11.x 概念:Node.js采用谷歌浏览器的V8引擎,用C ...
随机推荐
- 批处理——服务器的web文件备份
首先建立三个文本文件,稍后会变成.bat结尾的批处理文件. 第一个文件:copyfile.bat[复制需要备份的文件到tmp文件下,等待压缩时使用] xcopy "D:\Webhost\*. ...
- Android 自定义 view(三)—— onDraw 方法理解
前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...
- .net之工作流工程展示及代码分享(二)工作流引擎
在介绍完表单类的时候,接下来介绍工作流引擎,主要由四个类组成,分别是流程.流程步骤.流程实例.流程步骤实例类. 流程类: [Serializable] public class Flow { [Xml ...
- 雾里看花般的迷茫--货运APP
移动互联网正在改变我们的生活方式,各种手机APP充斥着人们的生活,物流行业也不例外.货运APP的出现,对于物流行业是一个提升的机会,也是迈向标准化和专业化的一个有效途径. 经过三十多年的发展,我国物流 ...
- CSS、HTML5、JS
[att*=value]{}包含value属性的所有元素样式.[id*=div]{} a[href$=jpg]:after{} [att^=value]{}开头字符包含value属性的所有元素样式 [ ...
- 被碾压过得Samsung SCH-W319 的取证恢复
2015年2月笔者接到一台! 被车轧过的手机Samsung SCH-W319,要求恢复 如图,显示屏被轧过,屏弯掉了 电池亦无,目前打不开!如下图: 配好电池后是这个样子,终于可以获得镜像dump 而 ...
- 利用CNN进行人脸年龄预测
很久之前做的东西了,最近做了一个人脸相似度检测,里面用到了这里的一个模型,所以抽个空把人脸年龄检测的思路总结一下. 与其他CNN分类问题类似,人脸年龄预测无非就是将人脸分为多个类别,然后训练卷积神经网 ...
- MySQL时间段查询
现实中我们会遇到统计报表.比如查询当月每一天的数据数量...等等之类的.以下内容就是有关这方面的咯. 首先要知道几个函数 mysql> select now(); //这个是显示的当前时间 +- ...
- base64与byte[]之间转换
主要是根据BASE64Encoder 和BASE64Decoder 进行操作实现,具体例子如下: BASE64Encoder encode = new BASE64Encoder(); //将byte ...
- js爬虫
1.爬虫相关的包 (1)const request = require('superagent'); // 处理get post put delete head 请求 轻量接http请求库,模仿浏 ...