文章目录

  • 背景知识
  • nodeJS内容
  • 包管理
  • 核心模块
  • 常用模块
  • 文件世界
  • 网络天地
    • TCP服务器
    • TCP客服端
    • HTTP服务器
  • 数据库海洋
    • 使用MongoDB
    • 连接MySQl
    • 实战
    • nodeJS框架:
    • 选择框架建议:

背景知识

node.js创始人—Ryan Dahl。2009.2首次在自己博客创建Web服务器并提供一个库。5月在GitHub发布最初版本。

事件驱动

在于注册事件后,等待事件触发执行,而不需要依赖自身出现的顺序。充分利用了系统资源,执行代码无需阻塞等待某种操作完成,有限的资源可以用在其他任务。

性能出众

以单进程、单线程模式运行。

单线程

这里指主线程为“单线程”,所有阻塞的部分交给一个线程池处理,然后主线程通过一个队列跟线程池协作。

异步、非阻塞I/O

例如文件操作等许多函数都是异步执行的,
发出I/O调用;执行回调

注意事项:在处理CPU密集型应用、模板渲染、压缩、解压缩、加密、解密等操作都是nodejs的弱项

nodeJS内容

nodeJS自带REPL(交互式运行环境),也可以在浏览器上尝试。

console

console.dir()将一个对象输到控制台
console.time() ; console.timeEnd()输入代码的运行时间
console.trace()输出当前位置栈信息。

包管理

npm init

可生成一个package.json文件,是整个项目的描述文件,通过这个文件可以清楚了解项目的包依赖关系、版本等等信息。
直接命令:npm init -y 或 npm init --yes

npm i < package name >

–save 或 -S可放在dependencies字段中
继续加 -dev 则在开发阶段devDependencies字段中
建议将所有的项目安装包都记录在package.json文件中,我们使用使用时,只需执行npm i 即可,不需要时npm uninstall。

核心模块

http模块

创建Http服务器、客户端

url模块

url地址处理
url.parse():解析一个url地址,返回一个url对象
url.fomate(urlObj):接受一个url对象为参数,返回一个完整url地址
url.resolve(from,to)接受一个base url对象和一个href url 对象,像浏览器一样解析,返回完整地址。

querystring模块

查询字符串处理
querystring.parse():类似JSON.parse()
querystring.stringify():类似JSON.stringify();

常用模块

util模块

util.inspect():返回一个对象反序列化形成的字符串
util.format():返回使用占位符格式化的字符串
util.log():类似console.log()。

path模块

路径处理
path.join():将所有参数连接起来,返回一个路径
path.extname():返回路径参数的拓展名,没有时返回一个空字符串
path.parse():将路径解析为一个路径对象
path.format():接受一个路径对象参数,返回一个完整的路径地址。

dns模块

dns.resolve():将一个域名解析为一个指定类型的数组
dns.lookup():返回第一个被发现的IPv4或者IPv6的地址。
dns.reverse():通过IP解析域名。

文件世界

打开文件

fs.open(path,flags[,mode],callback)

flag值 说明
r 以读取模式打开文件,文件不存在抛出异常
r+ 以读写模式打开文件,文件不存在抛出异常
rs 以同步方式读取文件
rs+ 以同步方式读取和写入文件
w 以写入模式打开文件,文件不存在就创建
wx 类似w,但文件路径存在则文件写入失败
w+ 以读写模式打开文件,文件不存在就创建
wx+ 类似w+,但文件路径存在则文件读写失败
a 以追加模式打开文件,文件不存在则创建
ax 类似a,但文件路径存在则追加失败

关闭文件

fs.close(fd,callback)

读取文件

fs.read()
fs.readFile()

写入文件

fs.writeFile()
fs.appendFile();

其他文件操作(csv、xml、json)

1、首先下载 (npm i csv)
2、解析生成csv文件
3、将csv文件转换为txt文件

目前nodeJS并不支持中文GBK或GB2312之类的编码,需引入第三方模块(iconv或iconv-lite; iconv仅支持Linux)
目前支持:utf-8、ucs2、ascii、binary、base64、hex

网络天地

TCP服务器

使用net模块。
net.createServer()

let net = require('net');
let server = net.createServer((socket)=>{conosle.log('someone connect');
})

监听客户端连接
server.listen()

server.listen(8888,()=>{console.log('server is listening');
})

手动监听写法

server.listen(8888);
server.on('listening',()=>{console.log('server is listening');
})

要使用Win的Telnet可使用命令:open localhost 8888
除了listening外,还有connection、close、error事件。

查看服务监听地址

server.address()
里面有三个属性:port、family、address

连接服务器的客户端数量

server.getConnections(err,count);

server.maxConnections = 3;
server.getConnections((err,count)=>{console.log(count);
})

获取客户端发送的数据

监听data事件

server.on('data',()=>{console.log(data.toString());
})

socket对象除了data事件外,还有connect、end、error、timeout等事件。

发送数据给客户端

利用socket.write(data,encode)
第一个参数为数据,二个为编码格式(选填),可有回调函数。

socket.write(data,()=>{let writeSize = socket.bytesWritten;
})
socket.on('data',()=>{let readSize = socket.bytesRead;
console.log(readSize);
})

socket对象除了bytesWritten、bytesRead发送接收字节数属性外,还有localPort(本地端口的地址)、lacalAddress(本地IP地址)、remote Port(远程端口地址)、remoteFamily(远程IP协议族)、remoteAddress(远程IP地址)。

TCP客服端

创建客户端

let net = require('net')
let client = new net.Socket(obj);

obj包括:fd(指定一个存在的文件描述符,默认null);readable(是否允许在这个socket上读,默认false);writeable(…写…);allowHalfOpen(是否让服务器回发一个fin包,false/true)。
连接tTCP服务器

let client = net.Socket();
client.connect(8888,'127.0.0.1',()=>{console.log('connect the server');
})

获取从TCP服务器发送的数据

client.connect(8888,'127.0.0.1',()=>{console.log('connect the server');
})
client.on('data',(data)=>{console.log(data)
})

向TCP服务器发送数据

client.connect(8888,'127.0.0.1',()=>{client.write('message from client');//发送的数据
})

HTTP服务器

创建HTTP服务器

let http = require('http');
let server = http.createServer((req,res)=>{res.writeHead(200,{'content-type':'text/plain'});res.end('hello,nodeJS');
})
server.listen(8888,()=>{console.log('listening port 8888');
})

列:

//读取html文件
let server = http.createServer((req,res)=>{res.writeHead(200,{'content-type':'text/html'})let data = fs.readFileSync('./index.html');res.write(data);res.end();
})

content-type作用就是表示客户端或服务器传输数据的类型,两个通过这个来做相应的解析;如果是原来的值就会直接在页面上显示index.html代码
路由控制

//处理html、js、css和图片
module.exports = {'.html':'text/html','.css':'text/css','.js':'text/javascript','.gif':'image/gif','.ico':'image/x-icon','.jpeg':'image/jpeg','.jpg':'image/jpeg','.png':'image/png'
}

路由控制返回文件

let server = http.createServer((req,res)=>{let filePath = '.' + url.parse(req.url).pathname;if(filePath === './'){filePath = './index.html';}//判断相应文件是否存在fs.exists(filePath,(exist)=>{if(exist){let data = fs.readFileSync(filePath);let contentType = mine[path.extname(filePath)];res.writeHead(200,{'content-type':contentType})res.write(data);res.end();}else{res.end('404');}})
})

UDP服务器

let dgram = require('dgram');
//创建UDP服务器
let socket = dgram.createSocket('udp4');

UDP中socket对象主要有以下方法:
bind():绑定端口号
send():发送数据
address():获取该socket端口号对象相关的地址信息
close():关闭socket对象

数据库海洋

使用MongoDB

使用mongoose连接mongDB:npm i mongoose
使用node-mongodb-native连接MongoDB:npm i mongodb
详细查看mongodb网.

连接MySQl

准备:npm i mysql

const mysql = require('mysql');
const connection = mysql.createConnection({host:'localhost',port:3306,user:'root',password:'123456',database:'homedata'
})

结束连接

connection.end(()=>{})
//也可使用destory()方法,该方法会立即终止底层套接字,不会触发更多的事件和回调函数。
connection.destory()

mysql模块提供一个query()方法,可以用来执行sql语句,从而对mysql数据库进行操作。

connection.query('select * from data',(err,rows)=>{})

connection.query()方法还有一个paramInfo参数可选,当sql语句中含有变量时可以将“?”作为占位符放置在sql语句中,通过paramInfo参数传递给sql语句。

connection.query('select * from ?',[table],(err,rows)=>{})

mysql模块还提供一个escape()方法,用于防止sql注入攻击。

//定义sql语句
let sql = 'select * from users where userid=123'+connection.escape(userid);
connection.query(sql,(err,rows)=>{})

实战

使用express
npm i express express-generator -g
express -e Folde_rname
npm i
npm i mysql -S
npm i ejs

nodeJS框架:

Sinatra-like:
express,官方推荐
hapi
Koa.js
flaliron
total.js
locomotive
Rails:
Sails.js 自主选择前、后端的数据库
geddy
compoundJS
全栈框架:
AllcountJS
Derby 适用于需要更快运行速度的应用
Feathers
SocketStream
Mean.js
Mean.io
Meteor 非常适合自学者
Meatier
TWEE.IO
Mojito
Seeds.js
SANE

选择框架建议:

简单Web开发:Exporess + EJS + Mongoose/MySql
聊天室:Express + socket.io
爬虫: Cheerio/Request
博客:Hexo
论坛:Node Club
控制台工具:tty.js
在线游戏:Pomelo

nodeJS读书笔记相关推荐

  1. Node.js: 深入浅出Nodejs读书笔记

    今天终于把朴灵老师写的<深入浅出Node.js>给学习 完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架.库的使用层面上,而是从不同的视角来揭示Node自己内 ...

  2. Nodejs Promise 读书笔记

    Nodejs Promise 读书笔记 前言 Promise是抽象异步处理对象以及对其进行各种操作的组件.(Promise并不是从JavaScript中发源的概念).简单说就是一个容器, 里面保存着某 ...

  3. 白帽子讲WEB安全读书笔记(慢慢更新)

    道哥写的白帽子讲WEB安全的读书笔记 文章目录 2020.3.23 ◆ 前言 ◆ 第一篇 世界观安全 1.1 Web安全简史 >> 1.1.1 中国黑客简史 >> 1.1.2 ...

  4. 读书笔记《Spring Boot+Vue全栈开发实战》(下)

    本书将带你全面了解Spring Boot基础与实践,带领读者一步步进入 Spring Boot 的世界. 前言 第九章 Spring Boot缓存 第十章 Spring Boot安全管理 第十一章 S ...

  5. 【读书笔记】知易行难,多实践

    前言: 其实,我不喜欢看书,只是喜欢找答案,想通过专业的解答来解决我生活的困惑.所以,我听了很多书,也看了很多书,但看完书,没有很多的实践,导致我并不很深入在很多时候. 分享读书笔记: <高效1 ...

  6. 读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)

    读书笔记:编写高质量代码--web前端开发修炼之道 这本书看得断断续续,不连贯,笔记也是有些马虎了,想了解这本书内容的童鞋可以借鉴我的这篇笔记,希望对大家有帮助. 笔记有点长,所以分为一,二两个部分: ...

  7. 《编程匠艺》读书笔记

    <编程匠艺>读书笔记之一 <编程匠艺>读书笔记之二 <编程匠艺>读书笔记之三 <编程匠艺>读书笔记之四 <编程匠艺>读书笔记之五 <编 ...

  8. 《Java: The Complete Reference》等书读书笔记

    春节期间读了下<Java: The Complete Reference>发现这本书写的深入浅出,我想一个问题,书中很多内容我们也知道,但是为什么我们就写不出这样一本书,这么全面,这么系统 ...

  9. oracle直查和call哪个更快,让oracle跑的更快1读书笔记二

    当前位置:我的异常网» 数据库 » <>读书笔记二 <>读书笔记二 www.myexceptions.net  网友分享于:2013-08-23  浏览:9次 <> ...

最新文章

  1. Cesium中Clock控件及时间序列瓦片动态加载
  2. Ansible剧本介绍及使用演示(week5_day2)--技术流ken
  3. 绝对不忽悠、暑期择机功能该咋选?
  4. 云场景实践研究第27期:袋鼠云
  5. NUC1100 Biorhythms【中国剩余定理】
  6. C# label控件竖直显示 label控件垂直显示
  7. 入侵检测——WebCrack
  8. Matlab求解空间曲线的切线和法平面
  9. 皮尔森残差_残差与标准化残差
  10. 麓堂诗话 明 李东阳 著
  11. 两年制大专计算机网络技术,湖南都市五年制大专_计算机网络技术专业_2021年报名...
  12. 从网页中获取图片链接的方法。
  13. Android-O wifi PNO扫描流程
  14. thinkpad T430改装WiFi6网卡ax200,加装4G模块
  15. 一个可以在线编写matlab的网站,你了解吗?
  16. php 正则表达式 环视,正则表达式教程五 —— 环视(零宽断言)
  17. 不止Docker:8款容器管理开源方案
  18. Oracle动态视图v$sql的说明和使用
  19. 授时系统ntp服务器地址,国家授时中心的NTP服务器地址 210.72.145.44
  20. JavaScript细碎知识

热门文章

  1. 学生使用计算机登记表,电脑室使用登记表.doc
  2. python卸载模块的方法汇总_Python卸载模块的方法
  3. 一个简单的银行存取款小程序
  4. matlab实现无人机自组网,无人机自组网多径路由协议研究
  5. 人物 | 中本聪与他的“六大罗汉”
  6. Lambda表达式和SteamAPI
  7. PhotoShop CC安装抠图插件KnockOut 2
  8. 应用计算机技术的纺织行业,计算机技术在纺织行业中的应用
  9. 电商用户消费数据RFM分析
  10. “互联网+”和跨界当道 大数据解码北京房产市场