nodeJS读书笔记
文章目录
- 背景知识
- 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读书笔记相关推荐
- Node.js: 深入浅出Nodejs读书笔记
今天终于把朴灵老师写的<深入浅出Node.js>给学习 完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架.库的使用层面上,而是从不同的视角来揭示Node自己内 ...
- Nodejs Promise 读书笔记
Nodejs Promise 读书笔记 前言 Promise是抽象异步处理对象以及对其进行各种操作的组件.(Promise并不是从JavaScript中发源的概念).简单说就是一个容器, 里面保存着某 ...
- 白帽子讲WEB安全读书笔记(慢慢更新)
道哥写的白帽子讲WEB安全的读书笔记 文章目录 2020.3.23 ◆ 前言 ◆ 第一篇 世界观安全 1.1 Web安全简史 >> 1.1.1 中国黑客简史 >> 1.1.2 ...
- 读书笔记《Spring Boot+Vue全栈开发实战》(下)
本书将带你全面了解Spring Boot基础与实践,带领读者一步步进入 Spring Boot 的世界. 前言 第九章 Spring Boot缓存 第十章 Spring Boot安全管理 第十一章 S ...
- 【读书笔记】知易行难,多实践
前言: 其实,我不喜欢看书,只是喜欢找答案,想通过专业的解答来解决我生活的困惑.所以,我听了很多书,也看了很多书,但看完书,没有很多的实践,导致我并不很深入在很多时候. 分享读书笔记: <高效1 ...
- 读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)
读书笔记:编写高质量代码--web前端开发修炼之道 这本书看得断断续续,不连贯,笔记也是有些马虎了,想了解这本书内容的童鞋可以借鉴我的这篇笔记,希望对大家有帮助. 笔记有点长,所以分为一,二两个部分: ...
- 《编程匠艺》读书笔记
<编程匠艺>读书笔记之一 <编程匠艺>读书笔记之二 <编程匠艺>读书笔记之三 <编程匠艺>读书笔记之四 <编程匠艺>读书笔记之五 <编 ...
- 《Java: The Complete Reference》等书读书笔记
春节期间读了下<Java: The Complete Reference>发现这本书写的深入浅出,我想一个问题,书中很多内容我们也知道,但是为什么我们就写不出这样一本书,这么全面,这么系统 ...
- oracle直查和call哪个更快,让oracle跑的更快1读书笔记二
当前位置:我的异常网» 数据库 » <>读书笔记二 <>读书笔记二 www.myexceptions.net 网友分享于:2013-08-23 浏览:9次 <> ...
最新文章
- Cesium中Clock控件及时间序列瓦片动态加载
- Ansible剧本介绍及使用演示(week5_day2)--技术流ken
- 绝对不忽悠、暑期择机功能该咋选?
- 云场景实践研究第27期:袋鼠云
- NUC1100 Biorhythms【中国剩余定理】
- C# label控件竖直显示 label控件垂直显示
- 入侵检测——WebCrack
- Matlab求解空间曲线的切线和法平面
- 皮尔森残差_残差与标准化残差
- 麓堂诗话 明 李东阳 著
- 两年制大专计算机网络技术,湖南都市五年制大专_计算机网络技术专业_2021年报名...
- 从网页中获取图片链接的方法。
- Android-O wifi PNO扫描流程
- thinkpad T430改装WiFi6网卡ax200,加装4G模块
- 一个可以在线编写matlab的网站,你了解吗?
- php 正则表达式 环视,正则表达式教程五 —— 环视(零宽断言)
- 不止Docker:8款容器管理开源方案
- Oracle动态视图v$sql的说明和使用
- 授时系统ntp服务器地址,国家授时中心的NTP服务器地址 210.72.145.44
- JavaScript细碎知识
热门文章
- 学生使用计算机登记表,电脑室使用登记表.doc
- python卸载模块的方法汇总_Python卸载模块的方法
- 一个简单的银行存取款小程序
- matlab实现无人机自组网,无人机自组网多径路由协议研究
- 人物 | 中本聪与他的“六大罗汉”
- Lambda表达式和SteamAPI
- PhotoShop CC安装抠图插件KnockOut 2
- 应用计算机技术的纺织行业,计算机技术在纺织行业中的应用
- 电商用户消费数据RFM分析
- “互联网+”和跨界当道 大数据解码北京房产市场