了不起的Node.js读书笔记(Nodejs学习心得分享)

了不起的Node.js读书笔记(Nodejs学习心得分享)

原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn

第二章 Js概览

基于GoogleV8引擎

  • Object.keys(o)
  • 数组方法:遍历forEach、过滤filter、改变map
  • 实现了String.prototype.trim()
  • 含有JSON解析

第三章 阻塞与非阻塞IO

单线程注意点

  • 小心处理内存中的变量,可能会影响两次访问的结果
  • 不要编写阻塞式代码,可能会影响第二次访问的时间

事件轮训

  • 先注册事件
  • 不断询问这些事件是否已经分发dispatch
  • 当事件分发了,相应的回调就会被触发
  • 如果事件未触发,则继续执行其他代码
  • 捕获未来才会执行到的函数所抛出的异常是不可能的
  • 避免同步IO

第四章 Nodez中的Javascript

global对象

  • 对应于浏览器window

process对象

  • process.nextTick == serTimeout(fn,1)

模块

  • require module exports
  • NPM
  • 绝对模块指Node内置模块以及在node_modules模块require(‘fs’)
  • 相对模块指通过相对路径找的模块require(‘./module’)
  • 暴漏数据exports.a(多个)、重写module.exports(一个)

事件

  • EventEmitter
  • 事件监听 on,事件分发emit,事件移除removeListener
  • 只执行一次once
  • data事件 数据是部分到达,而不是一次性全到达返回给你

buffer

  • 处理二进制数据

第五章CLI &FS API

Stream

  • stdin 可读流 stdout/stderr可写流
  • stdin.resume 等待用户输入
  • console == process.stdout.write(str + ‘\n’)

fs

  • readdirSync(__dirname) readFileSync同步
  • readdir(‘.’, async) readFile 异步
  • createReadSteam 读取可变大小 有data、end事件多用于图片、大型文件等
  • watchFile监视文件是否改变

process

  • process.argv 运行的参数
  • process.cwd 获取当前工作目录
  • process.env 环境变量
  • process.exit退出
  • 信号量

第六章TCP

TCP

  • 面向连接,基于IP协议
  • IP协议发包无序,TCP给发送的IP包含了标示符和数据流顺序信息
  • 面向字节 对字符以及字符编码完全无知,很好的灵活性
  • 可靠性 三次握手、窗口时间重发
  • 流控制,对接收和发送的速度控制
  • 拥堵控制 避免拥堵、数包报的延迟率和丢包率不会太高

Telnet

  • 当不是telnet协议是自动降级为TCP
  • 发送GET /HTTP/1.1模拟浏览器请求,两次回车

net

  • Node.js核心TCP模块
  • data close end事件
  • conn.setEncoding(‘utf-8’) 或 Buffer.toString(‘utf-8’)
  • 服务端createServer 客户端connect方法 connect事件

第七章HTTP

HTTP

  • TCP上层协议
  • Content-Type类型 文本、HTML、XML、JSON、PNG
  • Transfer-Encoding: chunked 输出的内容长度不能确定,Node天生的异步机制, 这样相应可以逐形成
  • 301 永久转移 302 临时转移 304资源未改变 403未授权 404资源未找到
  • 表单Content-Type application/x-www-form-unencoded

http 模块

  • request、response 参数
  • 判断路由为method+url
  • querystring模块 将字符串解析成对象
  • request方法模拟一个请求,传回来的数据2进制,设置utf-8
  • superagent 模拟客户端(模拟一个请求)模块
  • up 重启服务器模块

第八章Connect

工具集&中间件

  • 模块:connect
  • 中间件调用server.use(…)
  • 日志中间件console.log(‘%s %s ’, req.method, req.url)
  • 模拟请求时间过长中间件,在res.end是清除定时器
  • static中间件 处理静态文件connect.static(‘…’)
  • query中间件 获取查询字符串connect.query
  • logger 中间件connect.logger(‘dev’)
  • body parser中间件connect.bodyParser()如果在POST使用了JSON格式,body parser自动转JSON对象,还可以处理用户上传文件req.body.file多文件表单name 使用name=”file[]”
  • seesion中间件 会话connect.session 使用方法req.session.user
  • redis session 会话持久化中间件
  • methodOverride 中间件 让低版本浏览器支持PUT、DELETE、PATCH
  • basicAuth中间件 用户身份验证

第九章EXPRESS

express

  • WEB应用开发框架,基于Connect
  • app.set(‘view engine’, ‘ejs’) 设置EJS模板引擎
  • app.set(‘view’, __dirname + ‘/view’) 设置视图层路径
  • app.set(‘view cache’, ‘true) 设置模板缓存
  • 使用app.get()、app.put()、app.post()配置路由,可传参数如:id,获取req.params.id
  • res.render(‘search’,obj) 渲染模板
  • 其他设置大小写敏感、严格路由、jsonp回调
  • 为res和req提供了快捷方法 render渲染、redirect重定向req.header检查头信息
  • 中间件 app.user(function(req, res, next){})
  • 代码组织 分层、分包、MVC,建议仿照Spring MVC

模板引擎

Express/Haml/Jade/CoffeeKup/JQuery Templates for node

#第十章WebSocket

Ajax

  • 异步javascripy
  • 缺陷;每次都建立HTTP请求,消耗网络资源,不适于实时服务 HTML5 WebSocket
  • 基于ws协议
  • node支持:websocket.io
  • 客户端new WebSocket

缺陷

  • 关闭不意味着断开,使用心跳检测机制判断
  • 对JSON支持不够友好
  • 客户端临时断开无法解决 使用定时器或者刷新页面?
  • 兼容性

第十一章Socket.io

优势

  • 跨浏览器,支持WebSocket则原生,不支持使用长连接方式,连接会持续打开 20-50s
  • 即使浏览器支持的WebSocket被代理或者防火墙禁止了,Socket.io仍然会通过其 他技术来解决
  • 如果客户端停止传输信息,并且一定时间没有正常的关闭,则认为连接已经断开
  • 当连接丢失时,自动重连
  • 对逻辑进行分层,有命名空间
  • 支持emit分发和listen监听事件

第十二章MongoDB

MongoDB

  • 面向文档,绝大多数情况是JSON
  • 连接 new mongodb.Server(‘127.0.0.1’, 27017)
  • API open insert find ensureIndex findOne
  • $set 设置 $push 推入数组

Mongoose

  • 类似于JAVA中ORM框架,简化数据库开发
  • 连接mongoose.connect(‘mongodb://localhost/database’)
  • Schema:一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力
  • Model: 由Schema发布生成的模型,具有抽象属性和行为的数据库操作对
  • Entity:由Model创建的实体,他的操作也会影响数据库
  • index 索引 title : {type : String, index : true} unique : true 唯一
  • new Schema({}).pre(‘save’, function(){})保存之前做一些处理
  • 常用API find,findOne,remove,update,count
  • new Schema({}).find({_id:‘xx’}).where(‘title’,‘xxx’).sort(‘content’, -1).limit(5).run(function(err, data){}) 类似JQ查询
  • .select(‘_id’, ‘name’)选择查询指定字段
  • .skip 跳过 mongoose.Schema.ObjectId 生成随机ID
  • clazz : [Clazz] 嵌套的Sehema
  • clazz: {type : ObjectId , ref: ‘Clazz’} 关联查询
  • 添加静态PersonSchema.statics.findByName通过model调用
  • 添加实例方法 PersonSchema.methods.findSimilarTypes Entity调用

第十三章MySQL

MySQL

  • 主要使用query执行SQL
  • 有占位符 ? 插入数据(和JAVA一样)
  • 使用seqelize Node版ORM框架

第十四章Redis

Redis

  • 应用场景:简单数据模型、数据集。适合存储在内存
  • seesion持久化

第十五章 代码共享

书写兼容性代码

  • 导出模块 ,前端后端都可使用

(function(module){ module.exports = function(a, b ){ return a+b; } If(‘undefined’ != typeof window) { Window.add = module.exports; } })(‘undefined’ == typeof module ? {module : {exports : {}}}: module)

  • 模拟实现ECMA:扩展原型或者实现工具函数
  • EventEmitter。Assert、XMLHttpRequest、DOM、WebSocket、node-canvas都在 git上有实现
  • bowserbuild 将node模块转为浏览器可识别的代码

第十六章测试

assert

  • 常用API ok,be/equal/eql/a/macth…

Mocha

  • 简化书写
  • 测试异步代码
  • 生成报告

6 回复

了不起的Node.js读书笔记(Nodejs学习心得分享)

原文摘自我的前端博客,欢迎大家来访问
http://www.hacke2.cn

第二章 Js概览

基于Google V8引擎
  • Object.keys(o):返回对象的所有可枚举属性。
  • 数组方法:forEachfiltermap
  • 实现了String.prototype.trim():去除字符串两端的空格。
  • 含有JSON解析:JSON.parseJSON.stringify
// 示例代码
const obj = { a: 1, b: 2 };
console.log(Object.keys(obj)); // ['a', 'b']

const arr = [1, 2, 3];
arr.forEach(num => console.log(num)); // 1 2 3

const trimmedStr = '  Hello World  ';
console.log(trimmedStr.trim()); // "Hello World"

const jsonStr = '{"name": "John", "age": 30}';
const jsonObj = JSON.parse(jsonStr);
console.log(jsonObj.name); // "John"

第三章 阻塞与非阻塞IO

单线程注意点
  • 小心处理内存中的变量,可能会影响两次访问的结果。
  • 不要编写阻塞式代码,可能会影响第二次访问的时间。
事件轮询
  • 先注册事件。
  • 不断询问这些事件是否已经分发。
  • 当事件分发了,相应的回调就会被触发。
  • 如果事件未触发,则继续执行其他代码。
  • 捕获未来才会执行到的函数所抛出的异常是不可能的。
  • 避免同步IO。
// 示例代码
setTimeout(() => {
  console.log('This is non-blocking code');
}, 0);

console.log('This is blocking code');

第四章 Node.js中的JavaScript

global对象
  • 对应于浏览器中的window对象。
// 示例代码
console.log(global === global.window); // false (在Node.js中)
process对象
  • process.nextTick 等效于 setTimeout(fn, 1)
// 示例代码
process.nextTick(() => {
  console.log('This runs after the current execution stack');
});
模块
  • require, module.exports, exports
  • NPM 包管理工具。
// 示例代码
const fs = require('fs');

fs.readFile('./example.txt', 'utf-8', (err, data) => {
  if (err) throw err;
  console.log(data);
});
事件
  • EventEmitter,事件监听on,事件分发emit,事件移除removeListener
// 示例代码
const EventEmitter = require('events');

const myEmitter = new EventEmitter();

myEmitter.on('event', () => {
  console.log('Event occurred');
});

myEmitter.emit('event'); // 触发事件
buffer
  • 处理二进制数据。
// 示例代码
const buf = Buffer.from('Hello World');
console.log(buf.toString()); // "Hello World"

第五章 CLI & FS API

Stream
  • stdin 可读流,stdout 可写流。
// 示例代码
process.stdin.on('data', (data) => {
  console.log(`Received data: ${data}`);
});
fs
  • readdirSync 同步读取目录。
  • readdir 异步读取目录。
// 示例代码
const fs = require('fs');

fs.readdir('.', (err, files) => {
  if (err) throw err;
  console.log(files);
});

第六章 TCP

TCP
  • 面向连接,基于IP协议。
  • IP协议发包无序,TCP给发送的IP包含了标示符和数据流顺序信息。
// 示例代码
const net = require('net');

const server = net.createServer((socket) => {
  socket.on('data', (data) => {
    console.log(`Received data: ${data}`);
  });
});

server.listen(3000, () => {
  console.log('Server listening on port 3000');
});

第七章 HTTP

http 模块
  • request, response 参数。
  • 判断路由为method+url
// 示例代码
const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
});

server.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});

第八章 Connect

工具集 & 中间件
  • connect 框架。
  • server.use(...)
// 示例代码
const connect = require('connect');
const app = connect();

app.use((req, res, next) => {
  console.log('Request received');
  next();
});

app.use((req, res) => {
  res.end('Hello World');
});

app.listen(3000);

第九章 Express

express
  • WEB应用开发框架,基于Connect。
// 示例代码
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Hello World');
});

app.listen(3000, () => {
  console.log('App listening on port 3000');
});

第十章 WebSocket

Ajax
  • 异步JavaScript。
// 示例代码
fetch('/api/data')
  .then(response => response.json())
  .then(data => console.log(data));

第十一章 Socket.io

优势
  • 跨浏览器支持,支持WebSocket则原生,不支持使用长连接方式。
// 示例代码
const io = require('socket.io')(3000);

io.on('connection', (socket) => {
  console.log('A user connected');
});

第十二章 MongoDB

MongoDB
  • 面向文档数据库,使用new mongodb.Server连接。
// 示例代码
const MongoClient = require('mongodb').MongoClient;

MongoClient.connect('mongodb://localhost:27017/mydb', (err, db) => {
  if (err) throw err;
  console.log('Database created!');
  db.close();
});

第十三章 MySQL

MySQL
  • 主要使用query执行SQL。
// 示例代码
const mysql = require('mysql');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'mydb'
});

connection.connect((err) => {
  if (err) throw err;
  console.log('Connected to MySQL database!');
});

第十四章 Redis

Redis
  • 应用场景:简单数据模型、数据集。
// 示例代码
const redis = require('redis');

const client = redis.createClient();

client.set('key', 'value', (err, reply) => {
  console.log(reply); // OK
});

第十五章 代码共享

书写兼容性代码
  • 导出模块,前端后端都可使用。
// 示例代码
(function(module){
  module.exports = function(a, b) {
    return a + b;
  }
})(typeof module !== 'undefined' ? module : undefined);

第十六章 测试

assert
  • 常用API ok, equal, eql, match 等。
// 示例代码
const assert = require('assert');

assert.strictEqual(1, 1); // 通过
Mocha
  • 简化书写,测试异步代码,生成报告。
// 示例代码
const assert = require('assert');
const mocha = require('mocha');

describe('Array', () => {
  describe('#indexOf()', () => {
    it('should return -1 when the value is not present', () => {
      assert.strictEqual([1, 2, 3].indexOf(4), -1);
    });
  });
});

希望这篇读书笔记能够帮助你更好地理解和掌握Node.js的核心概念和使用方法。


赞一个

鼎一个~

好多拼写错误 subdocument 和相关的 populate 为什么用 clazz来表示?

赞一个,这本书看的英文版本,内容还是比较适合初学入门的

了不起的Node.js读书笔记(Node.js学习心得分享)

第三章 阻塞与非阻塞IO

单线程注意点

  • 小心处理内存中的变量:在单线程环境中,全局变量和共享内存需要特别小心,因为它们会影响到后续代码的执行结果。

  • 不要编写阻塞式代码:阻塞式的操作会导致程序停止响应,因此应该尽量避免。例如,文件读写、网络请求等操作应该使用异步方式。

事件轮询

事件轮询是Node.js的核心特性之一。它通过以下步骤实现:

  1. 注册事件:通过on方法注册事件处理器。
  2. 询问事件:通过emit方法分发事件。
  3. 回调触发:当事件被分发时,对应的回调函数会被执行。
  4. 继续执行:如果事件未分发,程序将继续执行其他任务。
const EventEmitter = require('events');

const myEmitter = new EventEmitter();

// 注册事件
myEmitter.on('event', () => {
  console.log('事件触发');
});

// 分发事件
myEmitter.emit('event'); // 输出:事件触发

第四章 Node.js中的JavaScript

global对象

global对象相当于浏览器环境中的window对象,提供全局作用域的访问。

console.log(global); // 输出全局对象

process对象

process对象提供了与进程相关的各种信息和方法。

console.log(process.pid); // 输出进程ID

模块

Node.js的模块系统允许你导出和导入功能。

// module.js
module.exports.data = 'Hello World';

// main.js
const mod = require('./module');
console.log(mod.data); // 输出:Hello World

事件

EventEmitter是事件驱动编程的基础类。

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

myEmitter.on('event', (arg) => {
  console.log(`事件参数: ${arg}`);
});

myEmitter.emit('event', 'Hello!'); // 输出:事件参数: Hello!

Stream

Stream是处理流数据的一种方式,分为可读流、可写流等。

const fs = require('fs');
const readableStream = fs.createReadStream('input.txt');
const writableStream = fs.createWriteStream('output.txt');

readableStream.pipe(writableStream);

第五章 CLI & FS API

fs

fs模块提供了文件系统操作的功能。

const fs = require('fs');

// 同步读取目录
console.log(fs.readdirSync(__dirname));

// 异步读取目录
fs.readdir('.', (err, files) => {
  if (err) throw err;
  console.log(files);
});

第六章 TCP

net

net模块提供了TCP通信的功能。

const net = require('net');

const server = net.createServer((socket) => {
  socket.end('Hello Client\n');
});

server.listen(3000, () => {
  console.log('Server listening on port 3000');
});

通过以上内容,你可以更好地理解Node.js的基础知识及一些重要模块的使用方法。希望这些示例代码对你有所帮助。

回到顶部