node不得不学的美(上)

227 阅读5分钟

node感知

相信前端的小伙伴都对node有所了解,因为node.js第一次将js引入到后端开发,相比与其他后端语言,node最大的优势就是借助JavaScript天生的事件驱动机制加V8高性能引擎,使编写高性能Web服务轻而易举。

安装nodejs

Node.js平台是在后端运行JavaScript代码,所以,必须首先在本机安装Node环境。

  1. Node官网下载对应平台的应用程序。
  2. 安装时务必选择全部组件,包括勾选(Add to Path)这样就可以再系统中使用node和npm相关命令。
  3. 安装成功后。任意路径打开cmd输入node -v,如果安装上会输出如下指令
`v10.16.0`//版本为10.16

  1. 安装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! 最常用的就是这两个模块希望能好好学习。