学习常用的命令行下的命令及按键
考虑到后面一段时间我们将会与这个小窗
命令及键盘按键
node 空格 某个js文件 // 调用 node 程序,运行某个js文件
clear 或者 cls // 清空界面
ls/list/dir // 查看列表(list)
cd 目录名 // 进入到目录中去
cd .. // 返回上一级目录
cd \ // 直接回到根目录
Ctrl+C // 停止 Node 程序
输入部分文件名后按下 Tab 键 // 补全文件名 或 目录名, 多次tab会进行切换
↑ ↓ 上下箭头 // 切换历史输入
复制粘贴
在小黑窗中复制内容:选中内容,再点鼠标右键
把粘贴板中的内容复制到小黑窗: 点鼠标右键
nodejs中的模块分类
每个模块都是一个独立的文件。每个模块都可以完成特定的功能,我们需要时就去引入它们,并调用。
nodejs模块的分类:
-
核心模块
- 就是nodejs自带的模块,在安装完nodejs之后,就可以任意使用啦。相当于学习js时使用的Array对象。
- 源代码 github.com/nodejs/node…
-
自定义模块
- 程序员自己写的模块。相当于我们在学习js时的自定义函数。
-
第三方模块
- 其他程序员写好的模块。nodejs生态提供了一个专门的工具npm来管理第三方模块,后面我们会专门讲到。
- 相当于别人写好的函数或者库。例如我们前面学习的JQuery库,artTemplate等。
学习核心模块fs
目标:通过学习核心模块fs,掌握核心模块的基本使用方法
fs是file system的简写
文档
学会查 API,远远比会几个 API 更重要
理解核心模块
核心模块就是 Node 内置的模块,需要通过唯一的标识名称来进行获取。每一个核心模块基本上都是暴露了一个对象,里面包含一些方法供我们使用。一般在加载核心模块的时候,变量(或常量)的起名最好就和核心模块的标识名同名。
例如:const fs = require('fs')
const path = require('path')
console.log(path)
fs模块
fs模块(fs是 FileSystem的简写)是Node.js用来进行文件操作的模块,它属于核心模块。你引入之后就可以直接使用了。
核心模块的使用步骤:
-
引入模块
// 引入模块 const fs = require('fs'); // 可以使用var、let,但是建议使用const,因为我们不希望它被改变。 // 名字不必大写成FS,一般也就叫fs这个名字。 -
调用api实现自己的要求
fs.apiName()
fs模块中操作文件(或者文件夹)的方法,大多都提供了两种选择:
- 同步版本的
- 异步版本的
fs-readFile-异步格式
目标: 写代码去读出文件内容,并打印在屏幕上
格式
fs.readFile('文件路径'[,选项], function (err, data) {
if (err) throw err;
console.log(data);
});
说明:
-
参数1:文件路径。 相对路径和绝对路径均可。
-
参数2: 配置项,可选参数,可不写。主要用来配置字符集。一般可设置为'utf8',如果不设置该参数,文件内容会Buffer形式返回。
-
参数3: 读取完成后触发的回调函数。这个回调函数在读完文件后自动被nodejs自动调用,并传入 err 和 data
-
如读取成功,回调函数中的两个参数分别是:
-
err: null
-
data: 文件内容,如果不设置参数2,则返回二进制数据。可以使用 toString() 方法将二进制数据
转为正常字符串
-
-
如读取失败,回调函数中的两个参数分别是:
- err: 错误对象
- data: undefined
-
示例1:读文本内容
const fs = require("fs")
fs.readFile('文件路径',(err, data) => {
if (err) throw err;
console.log(data);
});
上面的data将会是一个Buffer对象类似于数组,它的元素为16进制的两位数,它表示读出来的内容在计算机中的二进制格式。它有一个toString()方法,可以用来把内容以UTF-8的格式转成字符串。
示例2:读文本内容-指定编码格式
const fs = require("fs")
fs.readFile('文件路径', "utf8", (err, data) => {
if (err) throw err;
console.log(data);
});
示例3:读入图片文件
确保你的目录下有图片
const fs = require("fs")
fs.readFile('./img/1.jpg', (err, data) => {
if (err) throw err;
console.log(data);
});
并不是它所有的文件都应该转成字符串的
示例4:体会异步的效果
异步的
const fs = require("fs")
console.log(1)
fs.readFile('文件路径', "utf8", (err, data) => {
if (err) throw err;
console.log(data);
});
console.log(2)
并不是它所有的文件都应该转成字符串的
练习
-
读文件试一试
- 不同类型的:.txt. , .js, .jpg, .avi(读一个很大电影)
- 不写utf8,写utf8
- 体会一下异步
fs-readFile-观察并处理错误
nodejs中的错误界面相比浏览器中的错误来说,并不友好。
如果读文件有错误
在node.js中遇到的错误之后,应该观察错误说明
ps. 能写代码的是高手;能解决问题才是大神
fs-readFile-同步格式
格式
const fs = require("fs")
let rs = fs.readFileSync('文件路径',"utf8");
console.log(rs)
- api的名字后面有Sync(async是异步的,sync表示同步的)
- 不是通过回调函数来获取值,而是像一个普通的函数调用一样,直接获取返回值
捕获同步格式中的错误对象
如果读成功,则会获取读出来的数据,如果失败了,则会中间后续所有的代码执行。
console.log(1)
let res = fs.readFileSync('errorPath.js')
console.log(res)
console.log(2)
解决方案:用try. catch 结构
try {
const fs = require("fs")
let rs = fs.readFileSync('文件路径',"utf8");
console.log(rs)
} catch(err) {
console.log(err)
}
fs-writeFile-文件覆盖写入
覆盖写入 writeFile
功能:向指定文件中写入字符串, 如果没有该文件则尝试创建该文件。它是覆盖写入:会把文件中的内容全部删除,再填入新的内容。
格式:
fs.writeFile(pathName, content, option, (err)=>{});
// 参数1: 要写入的文件路径 --- 相对路径和绝对路径均可,推荐使用绝对路径
// 参数2: 要写入文件的内容
// 参数3: 配置项,设置写入的字符集,默认utf-8
// 参数4: 写入完成后触发的回调函数,有一个参数 --- err (错误对象)
示例1: 写入.txt文件
const fs = require('fs')
fs.writeFile('./a.txt', 'hello world! \n 换一行', err => {
if (err) {
console.info(err)
throw err
}
})
示例2: 写入json
稍微把问题提升一下,问: 如何把数据写入文件中?
const fs = require('fs')
const data = [{name: '小王', age: 20}]
fs.writeFile('./a.txt', data, err => {
if (err) {
console.info(err)
throw err
}
})
上面的写法会出错: data不是一个字符串或者是Buffer
const fs = require('fs')
const data = [{name: '小王', age: 20}]
fs.writeFile('./a.txt', JSON.stringify(data), err => {
if (err) {
console.info(err)
throw err
}
})
作业
对json数据进行操作。
|--db
|-----data.json
|--yourfile.js
data.json
[{"name":"小王"},{"name":"小李"}]
yourfile.js
// 这里写你的代码
// ......
// 完成的功能是: node yourfile.js之后,会在data.json中添加一条记录:
会在data.json中添加一条记录
[{"name":"小王"},{"name":"小李"},{"name":"小张"}]
附:fs模块中的常用方法
| API | 作用 | 备注 |
|---|---|---|
| fs.access(path, callback) | 判断路径是否存在 | |
| fs.appendFile(file, data, callback) | 向文件中追加内容 | |
| fs.copyFile(src, callback) | 复制文件 | |
| fs.mkdir(path, callback) | 创建目录 | |
| fs.readDir(path, callback) | 读取目录列表 | |
| fs.rename(oldPath, newPath, callback) | 重命名文件/目录 | |
| fs.rmdir(path, callback) | 删除目录 | 只能删除空目录 |
| fs.stat(path, callback) | 获取文件/目录信息 | |
| fs.unlink(path, callback) | 删除文件 | |
| fs.watch(filename[, options][, listener]) | 监视文件/目录 | |
| fs.watchFile(filename[, options], listener) | 监视文件 | |
| fs.existsSync(absolutePath) | 判断路径是否存在 |
\