<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>