NodeJs简介
- Node是一个基于 Chrome V8引擎的JavaScript运行环境。
- Mode不是一种独立的语言、Node 不是JavaScript 框架。
- Node是一个除了浏览器之外的、可以让JavaScript运行的环境
Node.js是一个让javaScript运行在服务端的开发平台,是使用事件驱动,异步非阻塞I/O .单线程,跨平台的JS运行环境:
NodeJs的安装
在官网进行下载:https://nodejs.org/en/
下载完成后双击进行安装,默认设置即可(修改一下安装的地址)。安装完成之后在安装的地址下面有一个node.exe文件,双击打开。或者在cmd当中输入node回车也是相同的。
安装完成之后,创建两个文件夹node_cache
和 node_global
。设置全局安装目录和缓存目录,执行命令
npm config set cache F:\学习课程\前端\NodeJS\install\node_cache
npm config set prefix F:\学习课程\前端\NodeJS\install\node_global
后面的路径根据自己的nodejs安装的路径进行调整。
在这里进入之后,就可以直接在里面执行JavaScript代码,需要注意的是,按压两次ctrl+c退出,
但是在这里基本上不会直接在这个黑窗口进行编写js代码,js代码基本上在编辑器当中编写,如下图,js文件编写之后,在当前目录打开cmd,执行命令 node 文件名
回车查看输出结果。
读取文件
使用filesystem文件系统进行简单的测试,使用文件读取这个方法 filesystem 使用readfile方法,方法具体如下图所示
而是用js代码,先使用一个const 定义一个变量,依赖于fs这个api。使用readfile方法进行读取。打开相同路径下的file.txt这个文件。
const fs = require('fs')
fs.readFile("file.txt", 'utf-8',(err, data) => {
if (err) throw err;
console.log(data)
})
运行这个js文件,使用 node 文件名,如下图所示:就把文件内容读取出来了
写入文件
既然可以进行读取文件内容,那同样的可以进行文件写入,FileWrite文件写入方法对应的方法解释如下:可自行在api当中查看,
在这里我们可以进行简化:方法的参数分别为:写入的文件名、写入的内容、编码格式(可省略)、回调函数。
const fs = require('fs')
fs.writeFile("./file.txt", "this is write text", function(err) {
if (!err) {
console.log("success")
} else {
console.log(err)
}
})
之后我们在node下进行运行这个js文件,以及打开file.txt文件查看是否写入进去。
文件内容覆盖
在这里写入文件会把文件原先有的内容进行覆盖掉,这就出现一个问题,一般来说会要求文件内容进行追加:简单基本来说我们使用前面两个函数进行编写,先使用readFile进行读取数据,再使用WriteFile进行写入,代码如下:
const fs = require('fs')
fs.readFile("file.txt", 'utf-8', (err, data) => {
data += " hello changsha .";
console.log("read");
fs.writeFile("./file.txt", data, function(err) {
if (!err) {
console.log("success")
} else {
console.log(err)
}
})
})
在node下运行这个js文件
除了使用这个方法进行追加,在nodejs当中还提供了一个appendFile() 方法 进行执行这个文件内容追加的操作。语法如下:
代码实现如下所示:
const fs = require('fs')
fs.appendFile('file.txt', 'this is appendfile function', (err) => {
if (!err) {
console.log("append success!")
}
})
在node下运行这个js文件:查看输出,并且在文件当中查看内容是否已经追加上去。
文件的属性
在这里还是提供了一个stat()方法 用于访问这个文件的属性值。
代码实现如下所示:(在前面dir方法的基础上添加这个stat方法。)
var fs = require('fs')
fs.readdir('./', 'utf8', (err, data) => {
//console.log(data)
fs.stat(data[0], (err, data) => {
console.log(data)
})
})
在node下面运行这个项目:可以看到有很多的内容被打印出来,这些就是这个文件的属性内容。
但是在这里存在一个问题,当我们对一个文件夹先使用readdir获取所有文件的文件名,之后再使用stat方法进行获取数据,实现代码如下:
var fs = require('fs')
fs.readdir('./', 'utf8', (err, data) => {
//console.log(data)
for (var i = 0; i < data.length; i++) {
fs.stat(data[i], (err, data) => {
console.log(data[i])
})
}
})
这段代码逻辑上没有问题,问题在于在这里的回调函数不一定会执行到,在前面执行代码块的时候,不会停在那里等这个回调函数执行,这个时候的i的值会发生改变,所以我们进行打印输出之后可以看到返回值都是undefined。
怎样解决这个问题呢,我们可以使用到闭包。或者可以看到在一个js文件当中进行for循环,使用一个计时器进行延迟处理:
var arr = ['a', 'b', 'c']
for (var i = 0; i < arr.length; i++) {
setTimeout(function() {
console.log(arr[i])
}, 1000)
}
运行这个js文件,问题还是一样的,打印出来的值依旧是undefined。
使用一个闭包,修改代码如下:
for (var i = 0; i < arr.length; i++) {
(function(i) {
setTimeout(function() {
console.log(arr[i])
}, 1000)
})(i)
}
运行这个js文件,可以看到这个时候arr[i]
的值就可以被打印出来。
所以在前面对stat进行for处理的时候也同样的加上这个闭包进行处理即可。