node感知
相信前端的小伙伴都对node有所了解,因为node.js第一次将js引入到后端开发,相比与其他后端语言,node最大的优势就是借助JavaScript天生的事件驱动机制加V8高性能引擎,使编写高性能Web服务轻而易举。
安装nodejs
Node.js平台是在后端运行JavaScript代码,所以,必须首先在本机安装Node环境。
- 去Node官网下载对应平台的应用程序。
- 安装时务必选择全部组件,包括勾选(Add to Path)这样就可以再系统中使用node和npm相关命令。
- 安装成功后。任意路径打开cmd输入node -v,如果安装上会输出如下指令
`v10.16.0`//版本为10.16
- 安装node之后也可以使用npm(node包管理工具)工具了。可以方便下载一些包
node初体验
打开开发工具,创建HelloWorld.js文件
//这是代码段
console.log("Hello World")
打开命令窗口,切换到当前目录,,然后输入以下命令运行这个程序了。
//这是代码段
node ./HelloWorld.js
成功控制台会输出Hello World.
模块化
node内置了很多对象可以在使用的时候导入,也可以自己定义写对象或者方法,只需要在使用的时候引用即可
//这是导入内置模块的方法
import fs from 'fs'
//这是导出自定义的Persion
module.exports = Persion;
//这是子啊另一个文件导入Persion 并且重命名为persion 导入时文件后缀名可不写,默认为.js
//导入自定义模块的时候必须带路径
import persion from '路径/文件名'
常用模块
fs模块
Node.js内置的fs模块就是文件系统模块,负责读写文件。
和所有其它JavaScript模块不同的是,fs模块同时提供了异步和同步的方法。
什么是异步方法。因为JavaScript的单线程模型,执行IO操作时,JavaScript代码无需等待,而是传入回调函数后,继续执行后续JavaScript代码。
异步读文件代码如下:
var fs = require('fs');
fs.readFile('1.txt', 'utf-8', function (err, data) {
if (err) {
console.log(err);
} else {//没有错误时返回读取到的数据并打印出来
console.log(data);
}
});
异步读取时,传入的回调函数接收两个参数,当正常读取时,err参数为null,data参数为读取到的String。当读取发生错误时,err参数代表一个错误对象,data为undefined。这也是Node.js标准的回调函数:第一个参数代表错误信息,第二个参数代表结果。后面我们还会经常编写这种回调函数。
由于err是否为null就是判断是否出错的标志,所以通常的判断逻辑总是:
if (err) {
// 出错了
} else {
// 正常
}
同步读文件 用fs模块同步读取一个文本文件的代码如下:
var fs = require('fs');
var data = fs.readFileSync('sample.txt', 'utf-8');
console.log(data);
可见,原异步调用的回调函数的data被函数直接返回,函数名需要改为readFileSync,其它参数不变。
如果同步读取文件发生错误,则需要用try...catch捕获该错误:
try {
var data = fs.readFileSync('sample.txt', 'utf-8');
console.log(data);
} catch (err) {
// 出错了
}
写文件
将数据写入文件是通过fs.writeFile()实现的:
var fs = require('fs');
var data = 'Hello, Node.js';
fs.writeFile('output.txt', data, function (err) {
if (err) {
console.log(err);
} else {
console.log('ok.');
}
});
writeFile()的参数依次为文件名、数据和回调函数。如果传入的数据是String,默认按UTF-8编码写入文本文件,如果传入的参数是Buffer,则写入的是二进制文件。回调函数由于只关心成功与否,因此只需要一个err参数。
和readFile()类似,writeFile()也有一个同步方法,叫writeFileSync():
var fs = require('fs');
var data = 'Hello, Node.js';
fs.writeFileSync('output.txt', data);
Pormise封装来异步读取文件
使用Pormise实现读取文件操作代码如下。
var fs = require('fs');
function rFile(path) {//封装promise函数
return new Promise(function (resolve, reject) {
fs.readFile(path, 'utf-8', function (err, data) {
if (!err) {//没有错误时返回读取到的数据并执行成功的毁掉函数
resolve(data);
} else {
reject()//有错误的时候执行失败的毁掉函数
}
}
//==============使用====================
rFile('./1.txt')
.then(res=>{
console.log(res)
return rFile('./2.txt'
}))
.then(res=>{
console.log(res)
}).catch(err=>{
console.log("统一捕获异常")
})
//执行结果会先输出1.txt的内容在输出2.txt的内容 如果中途读取失败。会执行catch。
http模块
Node.js开发的目的就是为了用JavaScript编写Web服务器程序。因为JavaScript实际上已经统治了浏览器端的脚本,其优势就是有世界上数量最多的前端开发人员。如果已经掌握了JavaScript前端开发,再学习一下如何将JavaScript应用在后端开发,就是名副其实的全栈了。
HTTP协议
要理解Web服务器程序的工作原理,首先,我们要对HTTP协议有基本的了解。
HTTP服务器
要开发HTTP服务器程序,从头处理TCP连接,解析HTTP是不现实的。这些工作实际上已经由Node.js自带的http模块完成了。应用程序并不直接和HTTP协议打交道,而是操作http模块提供的request和response对象。
request对象封装了HTTP请求,我们调用request对象的属性和方法就可以拿到所有HTTP请求的信息;
response对象封装了HTTP响应,我们操作response对象的方法,就可以把HTTP响应返回给浏览器。
用Node.js实现一个HTTP服务器程序非常简单。我们来实现一个最简单的Web程序hello.js,它对于所有请求,都返回Hello world!:
var http = require('http');// 导入http模块:
// 创建http server,并传入回调函数:
var server = http.createServer(function (request, response) {
// 回调函数接收request和response对象,
// 获得HTTP请求的method和url:
console.log(request.method + ': ' + request.url);
// 将HTTP响应200写入response, 同时设置Content-Type: text/html:
response.writeHead(200, {'Content-Type': 'text/html'});
// 将HTTP响应的HTML内容写入response:
response.end('<h1>Hello world!</h1>');
});
// 让服务器监听8080端口:
server.listen(8080);
console.log('Server is running at http://127.0.0.1:8080/');
在命令提示符下运行该程序,可以看到以下输出:
$ node hello.js
Server is running at http://127.0.0.1:8080/
直接打开浏览器输入http://localhost:8080,即可看到服务器响应的内容:Hello World! 最常用的就是这两个模块希望能好好学习。