文档笔记----nodejs菜鸟教程
<html> <head> <meta charset="utf-8"> <title>文档笔记----nodejs菜鸟教程</title> <meta name="keyword" content="文档笔记----nodejs菜鸟教程"> <meta name="discription" content="文档笔记----nodejs菜鸟教程"> </head> <body> <script> 文档笔记-- --nodejs菜鸟教程 第一章 创建第一个应用 如果我们使用PHP来编写后端代码是时, 需要Apache或者Nginx服务器, 并且配上mod_php5模块和php_cgi. 使用nodejs时, 我们不仅仅在实现一个应用, 同时还实现了整个HTTP服务器.事实上, 我们的Web应用以及对应的web服务器基本是一样的 1 引入require模块: 用来载入node.js模块 var http = require("http"); 2 创建服务器: 服务器可以监听客户端的需求, 类似Apache / Nginx等HTTP服务器 3 接受请求与响应请求 拂去其端可以使用浏览器或者终端发送HTTP请求, 服务器接受请求后返回相应数据. http.createServer(function(request, response) { //内容类型 response.writeHead(200, { "Content-Type": "text/plain" }); //发送响应式请求 response.end("Hello World\n"); }).listen(8888); 第二章 NPM使用 NPM是随同Nodejs一起安装的包管理工具, 能解决Nodejs代码部署上的很多问题, 常见的使用场景有以下几种: 1 允许用户从NPM服务器下载被别人编写的三方包到本地使用 2 允许用户从NPM服务器下载并安装别人编写的命令程序到本地使用 3 允许用户将自己编写的包或者命令程序上传到NPM服务器供别人使用 查看版本 npm - v 全局安装npm npm install npm - g 安装express到本地 npm install express 卸载express npm uninstall express 查看安装路径 npm ls 更新express模块 npm update express 创建模块 npm init 第三章 Node.js REPL(交互式解释器) Node自带交互式解释器, 可以至此那个一下任务: 1 读取 - 读取用户输入, 解析输入的javascript数据结构并且存储在内存中 2 执行 - 执行输入的数据结构 3 打印 - 输出结构 4 循环 - 循环操作以上步骤直到用户量词按下ctrl + c按钮退出 下划线(_) 变量 -- > 获取表达式运算结果 ctrl + c 退出当前终端 ctrl + c按两次 退出Node REPL ctrl + d退出Node REPL 向上 / 向下方向键 - 查看历史命令 tab键 列出当前命令 help 列出使用命令 clear 退出多行表达式 save filename 保存当前的Node REPL 会话到指定文件 load filename 载入当前Node REPL会话的文件内容 第四章 Node.js 回调函数 Node.js异步编程的直接提现说就是回调函数 异步编程依托于回调函数, 但不能说使用了回调函数就能是异步编程 阻塞代码实例: var fs = require("file"); var data = fs.readFileSync("input.txt"); console.log(data.toString()); console.log("程序执行结束"); 非阻塞代码实例: var fs = require("file"); fs.readFile("input.txt", function(err, data) { if (err) { return console.error(err); } else { console.log(data.toStrign()); } }) console.log("程序执行结束"); 第五章 Node.js EventEmitter Node.js所有的异步I / O操作在完成是都会发送到事件队列 events只提供了events.EventEmitter 这一个对象 核心就是事件触发与事件监听功能的封装 //引入events模块 var events = require("event"); //创建eventsEmitter对象 var eventEmitter = new events.EventEmitter(); //绑定事件 event.on("some_event", function() { console.log("some_event触发"); }) //触发事件 event.emit("some_event"); 第六章 Buffer(缓冲区) javascript语言自身只有字符串数据类型, 没用二进制数据类型 但在处理像TCP流或者文件流时, 必须使用到二进制数据.因此在Node.js中, 定义了一个Buffer类, 该类用来创建一个专门存放二进制数据的缓存区 一个Buffer类似一个整数数组, 但他对应于V8堆内存之外的一块原始内容 var buf = new Buffer(10) //按长度创建 var buf = new Buffer([10, 20, 30, 40, 50]) //按给定的数组创建 var buf = new Buffer("www.runob.com", "utf-8"); //通过一个字符串创建 写入缓冲区 buf.write() //返回字节数 从缓冲区读数据 buf.toString() //返回数据字符串 转为JSON对象 buf.toJSON(); 合并缓冲区 buffer.concat(buf1, buf2, ..); // 缓冲区比较 buf1.compare(buf2); // 缓冲区裁剪 buf.slice(); 缓冲区长度 buf.length 第七章 Node.js Stream(流) Stram是一个抽象接口, Node中有很多对象实现了这个接口.例如, 对http服务器发起的request对象就是一个Stream, 还有stdout(标准输出) 分类: 1 readable 可读操作 2 writable 可写操作 3 duplex 可读可写操作 4 transform 操作别写入数据, 然后读出结果 所有的Stream对象都是EventEmitter对象 data: 当有数据可读时触发 end: 没有更多的数据可读时触发 error: 在接收和写入过程中发生错误时触发 finish: 所有数据已被写入到底层系统时触发 从流中读取数据 var fs = require("file"); var data = ''; //创建可读流 var readerStream = fs.createReadStream("input.txt"); //设置编码 readerStream.setEncoding("UTF8"); //处理流事件 readerStream.on("data", function(chunk) { data += chunk; }) readerStream.on("end"function() { console.log(data); }) readerStream.on("error", function(err) { console.log(err.stack); }) console.log("程序执行完毕"); 写入流 var fs = require("file"); var data = "324324324"; var writerStream = fs.createWriteStream("output.txt"); writerStream.write(data, "UTF8"); writerStream.end(); writerStream.on("finish", function() { console.log("写入完成"); }) writerStream.on("error", function(err) { console.log(err.stack); }) console.log("程序执行完毕"); 第八章 Node.js函数 匿名函数: 我们可以把一个函数作为变量传递.但是我们不一定要绕这个 "先定义,再传递" 的圈子, 我们可以直接在另一个函数的括号中定义和传递这个函数 execute(function(word) { console.log(word); }) 第九章 Node.js模块系统 为了让Node.js的文件可以相互调用, Node.js提供了一个简单的模块系统. 模块是Node.js应用程序的基本组成部分, 文件和模块是一一对应的.换言之, 一个Node.js文件就是一个模块 //func.js experts.func = function() { } module.experts = function() { } var f = require("func"); //引入的时候前者 f.func();后者 f(); 模块加载优先级 开始require - > 是否在文件模块缓存区中 - > 否 - > 是否原生模块 - > 否 - > 查找文件模块 - > 根据扩展名载入文件模块 - > 返回experts 是 - > 返回experts - > 是 - > 是否在原生模块缓存区中 - > 否 - > 加载原生模块 - > 缓存原生模块 - > 返回experts 第十章 GET / POST GET: var url = require("url"); POST: var querystring = require("querystring"); 第十二章 Node.js常用工具 util是一个Node.js核心模块, 提供常用函数的集合, 用于弥补核心javascript的功能过于精简的不足 util.inherits() 是一个实现对象间原型继承的函数. var util = require("util"); function Base() { } Base.prototype.showName = function() { } util.inherits(Sub, Base); var sub = new Sub(); //Sub仅仅继承了Base在原型中定义的函数,而构造函数内部的属性和函数都咩有被Sub继承 util.inspect(); //将任意对象转为字符串的方法 util.isArray() //判断传入对象是否为数组 util.isRegExp() //判断传入参数是否为正则 util.isDate() //判断传入参数是否为日期 util.isError(); //判断是否为一个错误的对象 第十三章 Node.js工具模块 OS模块 Path模块 Net模块 DNS模块 Domain模块 第十四章 Node.js路由 路由可以通过请求的URL路径来区别不同请求, 这是通过路由讲请求以url路径为基准映射到处理程序上 第十五章 Node.js全局对象 javacript中有一个特殊的对象, 它及其所有属性都可以在程序的任何地方访问 最外层定义的变量 全局随想的属性 隐式定义的变量 __filename __dirname setTimeout(); clearTimeout(); serInterval(); clearInterval(); console process //用于描述当前Node.js进程状态对象,提供了一个与操作系统的简单接口 第十六章 Node.js文件系统 //异步读取文件 readFile(); //异步 //同步读取文件 readFileSync(); //同步 建议使用异步, 比起同步, 异步方法性能更高, 而且没有阻塞 var fs = require("fs"); fs.readFile("input.txt", function(err, data) { if (err) { console.error(err.stack); } else { console.log(data.toString()); } }) var data = fs.readFileSync("input.txt"); console.log(data.toString()); fs.open("input.txt", function(err, fd) { }) fs.read(fd, buf, 0, buf.length, 0, function(err, bytes) { }) stats //异步写入文件 fs.writeFile("input.txt", "xiruneirong", function(err) { }) //关闭文件 fs.close(); //截取文件 fsftruncate(fd, 10, function(err) { }) //删除文件 fs.unlink("input.txt", function(err) { }) //创建目录 fs.mkdir("dir", function(err) { }) //读取目录 fs.readdir(dir, function(err, files) { if (err) { return console.error(err); } files.forEach(function(file) { console.log(file); }) }) //删除目录 fs.rmdir(dir, function() { }) 第十七章 Nodejs Express 框架 快速打算建一个完整的网站 Express框架核心特点: 1 可以设置中间件来响应http请求 2 定义了路由变用于执行不同的HTTP请求 3 可以通过向模板传递参数来动态渲染HTML页面 var express = require("express"); var app = express(); app.get("/", function(req, res) { res.send(); }) app.post('/', function(req, res) { console.log("主页 POST 请求"); res.send('Hello POST'); }) // /del_user 页面响应 var server app.listen(8888, function() { }) Request 对象 - request 对象表示 HTTP 请求, 包含了请求查询字符串, 参数, 内容, HTTP 头部等属性。 常见属性有: req.app: //当callback为外部文件时, 用req.app访问express的实例 req.baseUrl: 获取路由当前安装的URL路径 req.body / req.cookies: 获得「 请求主体」 / Cookies req.fresh / req.stale: 判断请求是否还「 新鲜」 req.hostname / req.ip: 获取主机名和IP地址 req.originalUrl: 获取原始请求URL req.params: 获取路由的parameters req.path: 获取请求路径 req.protocol: 获取协议类型 req.query: 获取URL的查询参数串 req.route: 获取当前匹配的路由 req.subdomains: 获取子域名 req.accepts(): 检查可接受的请求的文档类型 req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages: 返回指定字符集的第一个可接受字符编码 req.get(): 获取指定的HTTP请求头 req.is(): 判断请求头Content - Type的MIME类型 Response 对象 - response 对象表示 HTTP 响应, 即在接收到请求时向客户端发送的 HTTP 响应数据。 常见属性有: res.app: 同req.app一样 res.append(): 追加指定HTTP头 res.set() 在res.append() 后将重置之前设置的头 res.cookie(name, value[,option]): 设置Cookie opition: domain / expires / httpOnly / maxAge / path / secure / signed res.clearCookie(): 清除Cookie res.download(): 传送指定路径的文件 res.get(): 返回指定的HTTP头 res.json(): 传送JSON响应 res.jsonp(): 传送JSONP响应 res.location(): 只设置响应的Location HTTP头, 不设置状态码或者close response res.redirect(): 设置响应的Location HTTP头, 并且设置状态码302 res.send(): 传送HTTP响应 res.sendFile(path[,options][,fn]): 传送指定路径的文件 - 会自动根据文件extension设定Content - Type res.set(): 设置HTTP头, 传入object可以一次设置多个头 res.status(): 设置HTTP状态码 res.type(): 设置Content - Type的MIME类型 第十八章 RESFUL API 表述性状态传递 第十二章 多进程 nodejs是单线程的模式运行, 事件驱动处理并发, 这样有助于我们在多核cpu的系统上创建多个子进程, 从而提高性能 const fs = require("fs"); const child_process = require("child_process"); for (var i = 0; i < 3; i++) { var worker_process = child_process.fork("support.js".[i]); worker_process.on("close", function(code) { }) 第二十一章 mysql var mysql = require("mysql"); var connection = mysql.createConnection({ host: "127.0.0.1", user: "root", password: "", database: "test" }) connection.query("select....", function(err, res, fields) { }) } 第二十二章 MongoDB var MongoClient = require('mongodb').MongoClient; var DB_CONN_STR = 'mongodb://127.0.0:27017/test'; var insertData = function(db, callback) { //连接到表 site var collection = db.collection('site'); //插入数据 var data = [{ "name": "1221", "url": "www.hao123.com" }, { "name": "32132", "url": "c.baidu.com" } ]; collection.insert(data, function(err, result) { if (err) { console.log('Error:' + err); return; } callback(result); }); } MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("连接成功!"); insertData(db, function(result) { console.log(result); db.close(); }); }); </script> </body> </html>