<
NodeJs 基本模块使用
>
上一篇

NodeJs 核心模块使用
下一篇

javaScript 学习
NodeJs 基础练习!

第五天学习

Node.js

简述

javaScript是单线程执行,根本不能进行同步IO操作,所以JavaScript的这一“缺陷”导致了它只能使用异步IO。

在2009年,Ryan正式推出了基于JavaScript语言和V8引擎的开源Web服务器项目,命名为Node.js。

Node 上运行的JavaScript相比其他后端开发语言有何优势?

最大的优势是借助JavaScript天生的时间驱动机制加V8高性能引擎,使编写高性能Web服务轻而易举。

其次,JavaScript语言本身是完善的函数式语言,在前端开发时,开发人员往往写得比较随意,让人感觉JavaScript就是个"玩具语言"。但是,在Node环境下,通过模块化的JavaScript代码,加上函数式编程,并且无需考虑浏览器兼容性问题,直接使用最新的ECMAScirpt 6 标准,可以完全满足工程上的需求。

io.js
ios将首先添加新的特性,如果大家测试用得爽,就把新特性加入Node.js;io.js 是"尝鲜版", 而Node.js 是线上稳定版,相当于Fedora Linux 和 RHEL的关系
安装Node.js
sudo apt install -y node

如果安装正常应该看到这样的输出

node -v
  v12.6.0

继续在命令提示符输入node, 将进入Node.js的交互环境,输入任何JavaScript语句,回车都将得到输出结果

退出Node.js环境,只需要连续按两次Ctrl+c

npm

npm其实是Node.js的包管理工具(package manager)

作用:

  1. 使用别人写的某个包,放在npm官网上,如果需要使用,直接npm安装就可以直接使用了。
  2. 项目中,多个模块之间的依赖关系可以通过npm进行下载和管理。
hello world的编写
'use strict';
console.log('hello, world');

第一行总是写上 ‘use strict’; 是因为我们总是以严格模式运行JavaScript 代码,避免各种潜在危险。

运行:

node hello.js
  hello, world

文件名只能是英文字母、数字和下划线的组合

Node交互模式与浏览器的console操作一致

模块

在Node环境中,一个.js文件就称之为一个模块(module)

使用模块的最大好处就是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以背其他地方引用。我们在编写程序的时候,也仅此引用其它模块,包括Node内置的模块和来自第三方的模块。

使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写函数时,不必考虑名字会与其它模块冲突。

一个模块想要对外暴露变量(函数也是变量), 可以用module.exports = variable; 一个模块要引用其它模块爆了的变量,用 var ref = require(‘module_name’); 就拿到了引用模块的变量

CommonJS的模块实现原理

不建议使用 export.a = 函数

强烈建议使用module.exports = xxx的方式来输出模版变量。

module.exports = function() {return 'foo'}
model.exports.foo = function() {return 'foo'}
model.exports = 
{
  key : value/函数名
}
基本模块
fs

异步读文件

var fs = require('fs');
fs.readFile('文件名(相对、绝对)', 'utf-8', function(err, data) {
  if(err) {
    console.log('报错了');
  } else {
    //文件内容
    console.log(data);
  }
});

同步读文件

var fs = require('fs');
try {
  var data = fs.readFileSync('文件名(相对、绝对)', 'utf-8');
  console.log(data);
} catch(err) {
  //报错信息
  console.log(err);
}

如果读取的是二进制文件且不填入编码时,获取到的内容是buffer对象,转字符串为

data.toString('utf-8');

字符串转buffer对象

Buffer.from(text, 'utf-8');

异步写文件

fs.writeFile('abc.txt', data, function(err) {
	if(err) {
		//报错了
		console.log(err);
	} else {
    console.log('成功了');
  }
});

同步写文件

try {
	fs.writeFileSync('abc.txt', data);
  console.log('成功了');
} catch(err) {
  console.log("报错了");
  console.log(err);
}

获取文件详细信息

异步获取文件信息
fs.stat('文件名', function(err, stat) {
  if(err) {
    console.log('报错了');
    console.log(err);
  } else {
    console.log(stat.isFile());
    console.log(stat.isDirectory());
    if(fs.isFile()) {
      console.log(stat.size);
      console.log(stat.birthTime);
      console.log(stat.mtime);
    }
  }
})
同步获取文件信息
try {
  var stat = fs.stat('文件名');
  console.log(stat.isFile());
  console.log(stat.isDirectory());
  if(stat.isFile()) {
    console.log(stat.size);
    console.log(stat.birthtime());
    console.log(stat.mtime());
  }
} catch(err) {
  console.log('出错了');
  console.log(err);
}

注意

在fs模块中,提供同步方法是为了方便使用。那我们到底是应该用异步方法还是同步方法呢?

由于Node环境执行的JavaScript代码是服务端代码,所以,绝大部分需要在服务器运行期反复执行业务逻辑的代码,必须使用异步代码,否则,同步代码在执行时期,服务器将停止响应,因为JavaScript只有一个执行线程。

stream

stream 是Node.js提供的又一个仅在服务区端可用的模块,目的是支持”流”这种数据结构。

文件流读取 / 输入流 / 读文件
var fs = require('fs');
var rs = fs.createReadStream('文件名', '编码/conding');
rs.on('open', function(fd) {
  console.log("打开文件");
});

rs.on('ready', function() {
  console.log('准备读取文件');
});

rs.on('data', function(chunk) {
  console.log('正在读取文件');
  console.log(chunk);
});

rs.on('end', function() {
  console.log('文件已读取完毕');
})

rs.on('close', function() {
  console.log('已关闭文件');
});

rs.on('err', function(err) {
  console.log('报错了');
  console.log(err);
});
文件写入

字符串写入

var fs = require('fs');
var ws1 = fs.createWriteStream('文件名', '编码/enconding');
ws1.write('asdfadffsd');
ws1.write('end.');
ws1.end();

二进制流写入

var fs = require('fs');
var ws2 = fs.createWriteStrimg('文件名', '编码/encoding');
ws2.write(Buffer.from('adssafds', 'utf-8'));
ws2.write(Buffer.from('end.', 'utf-8'));
ws2.end();

pipe流操作(复制文件操作)

var fs = require('fs');
var rs = fs.createReadStream("文件名", "编码");
var ws = fs.createWriteStream("文件名", "编码");
rs.pipe(ws);
//不关闭写入文件流
rs.pipe(ws, {end :false});
Top
Foot