第一章-了解nodeJs

Google公司使用C++语言开发的一种高性能JS引擎,特点有非阻塞型I/O,事件环

非阻塞型I/O

传统单线程:访问数据库-数据库返回整个过程程序处于停滞状态。
nodeJs:访问数据库-数据库返回结果,转而执行后面的代码。

事件环

nodeJs中,在一个时刻只能执行一件事情的回调函数。但是在一个回调函数的中途可以处理其他事件(包括处理新的事件以及声明该事件的回调函数),然后返回执行原事件回调函数,这种机制称为事件环

nodejs运行机制

nodejs运行机制
  • V8引擎解析JavaScript脚本。
  • 解析后的代码,调用Node API
  • libuv库负责Node API的执行。它将不同的任务分配给不同的线程,形成一个Event Loop(事件循环),以异步的方式将任务的执行结果返回给V8引擎。
  • V8引擎再将结果返回给用户。

适合nodeJs开发的应用程序

当应用程序需要处理大量的并发输入/输出,而在向客户端发送响应的同时不需要处理非常复杂的处理的时候。

聊天服务器:具有很高的聊天应用程序中,大量用户与聊天服务器的并发连接,而服务器本身并不需要有非常复杂的逻辑处理。
综合服务类网站和电子商务网站:在服务器端可能每秒钟存在上千条数据并且需要写入到数据库。nodejs通过其队列机制将数据迅速书写在缓存区,然后再通过每一个单独的处理从缓存区取出数据进行书写。如果是(Apach或者Tmacat)阻塞性I/O,需要为每一条数据的写入进行等待。
模块化

模块为单位划分功能,每个模块中的全局变量均为私有。只有通过exports对象暴露出去。

exports.printFoo=function(){
  return 'foo';
}

如果需要在其他模块中使用则需要引入,然后进行到该目录通过命令行node another.js
在another.js

let foo=require('./foo.js');
console.log(foo.printFoo())// foo

常用模块表格

模块名 作用 稳定度
assert 为应用程序的单元测试添加断点操作 5-locked 今后不被修改
buffer 用于实现二进制数据的存储与转换 3-stable 稳定
child_process 用于实现子进程的创建与管理 3-stable 稳定
cluster 用于实现多进程 1-experimental 实验行阶段
console 用于为控制台输出信息 4-API Frozen 今后API部分不会被修改
crypto 用于实现数据的加解密处理 2-unstable 不稳定
debugger 内置调试器帮助开发者调试应用程序 3-stable 稳定
dns 用于实现与DNS相关的处理 3-stable 稳定
domain 用于实现多个I/O之间的协作处理 2-unstable 不稳定
events 用于为事件处理提供一个基础类 4-API frozen 今后API部分不会被修改
fs 用于操作文件及文件系统 3-stable 稳定
http 用于实现HTTP服务器端及客户端 3-stable 稳定
https 用于实现HTTPS服务器端及客户端 3-stable 稳定
net 用于创建TCP服务器与客户端 3-stable 稳定
os 用于获取操作系统信息 4-API Frozen 今后API部分不会被修改
path 用于处理文件路径 3-stable 稳定
punycode 用于实现Punycode字符串的编码及解码 2-unstable 不稳定
querystring 用于处理HTTP请求中使用的查询字符串 3-stable 稳定
readline 用于读取一行标准输入流 2-unstable 不稳定
repl 用于实现REPL(Read-Eval-Loop)交互式运行环境
stream 用于为流的输入/输出处理提供一个基础类 2-Unstable 不稳定
string_decoder 用于实现从二进制数据到字符串数据之间的转换 3-stable 稳定
tls 用于使用openSSL来实现TLS/SSL通信处理 3-stable 稳定
tty 用于获取来自于TTY终端的信息 2-unstable 不稳定
url 用于实现URL字符串的解析与格式化 3-stable 稳定
until 用于实现各种使用函数 5-locked 今后不会被修改
vm 用于为js脚本代码提供一个独立的运行环境 2-unstable 不稳定
zlib 内部使用zlib类库来实现数据的压缩及解压处理 3-stable 稳定

使用该模块则需要用require(引入)的方式。
let http=require('http');
该函数返回http模块对象,将该对象赋值给http变量,可通过http变量来访问http模块中的属性以及方法。
另外有一些类、函数、对象可以不引入直接使用。

类、函数、对象 描述
Buffer类 用于为二进制数据的存储提供一个缓存区
setTimeout函数 延时器
clearTimeout函数 清除延时器
setInterval函数 定时器
clearInterval函数 清除定时器
require函数 用于加载引入模块
module对象 用于访问模块信息
process 用于访问进程信息

第一个应用程序

let http=require('http');
//引入http模块
http.createServer(function(req,res){
    //使用createServer方法来创建用于接收HTTP客户端请求并返回响应的HTTP服务器应用程序。
    //req->客户端请求对象
    //res->服务器端所做出的响应对象
    res.writeHead(200,{'Content-Type':'text/html'});
    //res.writeHead方法书写响应头,同时将响应头中的状态码定义为200,内容类型定义为text/html,表示返回一段HTML代码
    res.write('<head><meta charset="utf-8" /></head>');
    //res.write方法书写一行HTML代码,在本例中书写一个<head>标签,并且在<head>标签中通过使用meta属性将HTML网页所使用的字符集定义为UTF-8字符,显示中文。
    res.end('你好');
    //res.end方法输出一行HTML代码并结束响应流。
}).listen(8080,"127.0.0.1");
//listen方法指定该服务器使用端口及服务器绑定地址,并对该端口进行监听。
console.log('server running at http://127.0.0.1:8080/');
//向命令窗口输出括号内的内容。

nodeJs调试

最开始使用的是npm install -g node-inspector命令安装,但是在安装的过程中会报错ERR! Tried to download(404): https://node-inspector.s3.amazonaws.com/debug/v1.0.1/node-v64-win32-x64.tar.gz
通过查询发现Node V8 的调试 API 发生了很大变化,Node inspector 基本废了。Node8 本身也内置了 debugger 工具。
所以采用的是node-inspect
npm install -g node-inspect
node --inspect (fileName)

总结:在整个过程中,改一次代码就需要在cmd中终止一次运行,然后重新node fileName 比较繁琐。可以利用supervisor来进行实时更新。

npm install -g supervisor
//然后 supervisor fileName
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容