Node.js 学习笔记
参考资料:
持续学习,持续更新…
Node.js概述
Node.js是运行在服务端的JavaScript。
Node.js是一个基于Chrome JavaScript运行时建立的一个平台。
Node.js能做什么?
Web服务后台
命令行工具:
- npm(node)
- hexo(node)
- git(C语言)
对于前端开发工程师来讲,接触 node最多的是它的命令行工具。
自己写的很少,主要是使用别人第三方发的
- webpack
- gulp
- npm
能学到什么?
1.B/S编程模型
- Node只是作为我们学习BS编程模型的一个工具而已
2.模决化编程 - RequireJs
- SeaJS
- @import (‘文件路径’)
-在 Node中可以像@import()
一样来引用加载JavaScript脚本文件
3.Node常用API
4.异步编程 - 回调函数
- Promise
- async
- generator
5.Express开发框架
6.ES6
写文件简单的错误处理
//写
var fs=require('fs');
fs.writeFile( './data/你好.md ','大家好,给大家介绍一下,我是Node.js ' , function (error){console.log('文件写入成功")
});
//读
fs.readFile( ' ./data/a.txt ', function (error,data) {
//<Buffer 68 65 6c 6c 6f 20 6e 6f 64 65 6a 73 ed ea>
//文件中存储的其实都是二进制数据 0 1
//这里为什么看到的不是0和1呢?原因是二进制转为16 进制了
//但是无论是二进制01还是16进制,人类都不认识
//所以我们可以通过tostring方法把其转为我们能认识的字符
// console.log(data)
//console.log(data.toString());
if (error) {
console.log( '读取文件失败了");
}else {
console.log(data.tostring());
}
});
//写
fs.writeFile( './data/你好.md','大家好,给大家介绍一下,我是Node.js ', function (error){
// console.log('文件写入成功")
// console.log(error)
if (error) {
console.log( '写入失败');
}else {
console.log('写入成功了");
}
})
简单的http服务
//构建一个Web服务器
//http核心模块
//1.加载http核心模块
var http = require('http');
//2.使用http.creatServer()方法创建一个Web服务器
//返回一个Server实例
// var server = http.createServer(function (request, response) {
// response.writeHead(200, {'Content-Type': 'text/plain'});
// response.end('Hello World');
// }).listen(8081);
// console.log('Server running at http://127.0.0.1:8081/');
//返回一个Server实例
var server = http.createServer();
//3.服务器要干嘛?
// 提供服务:对数据的服务
// 发请求
// 接收请求
// 处理请求
// 给个反馈(发送响应)
//注册request请求事件,就会自动触发服务器的request请求事件,
//然后执行第二个参数:回调处理
server.on('request',function(){
console.log('收到客户端的请求了');
});
//4.绑定端口号。启动服务器
server.listen(3000,function(){
//http://127.0.0.1:3000
console.log("服务器启动成功!");
});
发送响应
请求事件处理函数,接收两个参数
-
request 请求对象
-
response 响应对象(回调函数)
server.on('request',function(request,response){
console.log('已经收到客户端得请求');
});
var http = require('http');
var server = http.createServer();
server.on('request',function(request,response){
console.log('收到客户端的请求了');
//如果在浏览器里127.0.0.1:3000/a
//则终端显示:
//收到客户端的请求了
//请求路径是:/a
console.log("请求路径是:"+request.url);
//response对象的方法之一:write,用于像客户端发送响应数据
//write可以多次使用,最后用end结束响应,否则客户端一直等待
//运行不成功可能是浏览器或者网络问题。已解决
response.write('hello');//请求路径是:/favicon.ico
//告知响应结束,传递给用户
response.end();
//ps:url统一资源定位图
//通过不同路径响应不同内容
});
server.listen(3000,function(){
console.log("服务器启动成功!");
});
通过不同路径响应不同内容
不同路径不同响应:req.url,获取到端口之后得那一部分路径
var url = req.url; not defined
解决办法:Link
JSON.parse()或者JSON.stringify()
响应内容只能是字符串和二进制数据可用JSON.parse()或者JSON.stringify()转换
var http = require('http');
var server=http.createServer();
server.on('request',function(request,response){
//不同路径不同响应:req.url,获取到端口之后得那一部分路径
// var url = req.url; not defined
var url = request.url;
///re.url ➡not defined
// console.log(request.url);
if(url==='/'){
response.end('index page');
}
else if(url==='/baidu'){
response.end('baidu page');
}else{
response.end('404 Not Found');
}
//响应内容只能是字符串和二进制数据,
//可用JSON.parse()或者JSON.stringify()
});
// server.listen(80,function(){
// //80端口为默认:127.0.0.1
// console.log('Server start success');
// });
server.listen(3000,function(){
console.log('Server start success');
});
Node中的JavaScript
核心模块
NodeJs的API文档
Node为JavaScript提供了很多服务器级别的API,这些API大多数包装到了一个具名的核心模型中。
例如文件操作fs
核心模块:
var fs = require('fs');
var http = require('http');
//获取cpu的信息
var os =require('os');
console.log(os.cpus());
任何你需要的模块都可以从API文档
中调取模块进行配置。
模块系统
一个浏览器如何执行多个文件?(加载与导出)
1.require是一个方法
- 用于加载模块并执行里面的代码
- 拿到加载文件模块导出的接口对象,export默认是一个空对象
var ret=require('./b'); //输出:{},即b文件是一个空对象
- 把需要的另一个文件所有需要的被外部访问的成员加载,用
exports.
挂载到export对象中
//文件b:
export.s="hello";
exports.add=function(x,y){
return x+y;
}
//二者不一样
add=function(x,y){
return x-y;
}
var age=20;
exports.age=age
//文件a:
//调用b中的s:
var m=require('./b');
console.log(m.s); //输出:hello
console.log(m.add(10,20)); //输出30
2.Node模块有三种:
- 具名的核心模块,:eg:fs 、http
- 用户自己编写的文件模块
- 第三方
3.文件的引用通过require(./test.js)
来引用。后缀名可以省略。
4.Node中没有全局作用域,只有模块作用域,超出自身文件都没有作用。
- 如何让模块与模块之间进行通信?
readFile和sExports.readFile()的区别
//文件b:
exports.readFile=function(path,callback){
console.log('文件路径',path);
}
//文件a:
var fs=require('fs');
var sExport=require('./b');
sExport.readFile('.a.js'); //文件路径 ./a.js
fs.readFile('./a.js')//读的就是a文件
ip和端口号
ip
网卡是通过唯一的ip地址来进行定位的
域名通过DNS转换为ip地址
服务器相当于没有关闭的计算机
ip用于定位计算机
端口号
端口号用于定位应用程序
所有需要联网通信的软件都需要具有端口号
默认端口号最好不用。
可以开启多个服务,但是要用不同端口号
API已经高度封装,不需要知道对方ip和port就可以访问,我们可以直接发响应
下面只是举例子
server.on('request',function(){
console.log('请求我的客户端的端口号是',req.socket.remotePort);
});
console.log();
const { Console } = require('console');
var http = require('http');
// var server=http.createServer();
// server.on('request',function(){
// //API已经高度封装,不需要知道对方ip和port就可以访问,我们直接发响应
// console.log('请求我的客户端的端口号是',request.socket.remotePort);
// Console.log('当前请求我得ip是:',request.socket.remoteAddress)
// console.log();
// });
// server.listen(3000,function(){
// console.log('success!');
// })
const server = http.createServer((req, res) => {
const ip = res.socket.remoteAddress;
const port = res.socket.remotePort;
res.end(`Your IP address is ${ip} and your source port is ${port}.`);
}).listen(3000);//Your IP address is ::ffff:127.0.0.1 and your source port is 12720.
响应内容类型 Content-Type
在服务端默认发送的数据是utf8编码的内容,但是在浏览器不知道是utf8的内容,浏览器默认解析中文操作系统是gbk。
Solution:正确的告诉浏览器如何解析setHeader('Content-Type','text/plain;charset=utf-8');
http协议中,Content-Type用于告知浏览器数据内容发送的什么类型
Content-Type
Content-Type | |
---|---|
text/html | 识别html标签并utf-8 |
text/plain | 普通文本并utf-8 |
var http = require('http');
var server=http.createServer();
var fs=require('fs');
server.on('request',function(req,res){
var url = req.url;
if(url==='/s'){
//如何发动index.html页面
fs.readFile('./resource/index.html',function(err,data){
if(err){
res.setHeader('Content-Type','text/plain;charset=utf-8');
res.end('文件读取失败,请重试!!');
}else{
//data默认的是二进制数据,可以通过toString转换到能识别的字符串
//res.end();支持二进制和字符串
res.setHeader('Content-Type','text/html;charset=utf-8');
res.end(data);
}
//https://www.oschina.net/
//https://tool.oschina.net/commons
//如果访问图片,不需要指定编码。编码一般指字符编码
// fs.readFile('./resource/2020012175749891.jpg',function(err,data){
// if(err){
// res.setHeader('Content-Type','text/plain;charset=utf-8');
// res.end('文件读取失败,请重试!!');
// }else{
// //data默认的是二进制数据,可以通过toString转换到能识别的字符串
// //res.end();支持二进制和字符串
// res.setHeader('Content-Type','image/jpeg');
// res.end(data);
// }
});
}
});
server.listen(3000,function(){
console.log('Server start success');
});