1.fs模块
概念:fs模块是文件操作模块,fs是 FileSystem的简写。它用来对文件,文件夹进行操作。
// 引入模块。
// 可以使用var、let,但是建议使用const,因为我们不希望它被改变
const fs = require('fs');
所有的文件操作系统都是具有同步和异步的形式:
- 异步的形式总是将完成回调作为其最后一个参数,传给完成回到的参数取决于具体的方法,但是第一个参数始终预留用于异常,如果操作成功,则第一个参数将为null或者是undefined
const fs = require('fs');
fs.unlink('/tmp/hello', (err) => {
if (err) throw err;
console.log('已成功删除 /tmp/hello');
});
- 使用同步的操作发生的异常会立即抛出,可以使用 try…catch 处理,也可以允许冒泡。
const fs = require('fs');
try {
fs.unlinkSync('/tmp/hello');
console.log('已成功删除 /tmp/hello');
} catch (err) {
// 处理错误
}
- 使用异步的方法时无法保证顺序。 因此,以下的操作容易出错,因为 fs.stat() 操作可能在 fs.rename() 操作之前完成:
fs.rename('/tmp/hello', '/tmp/world', (err) => {
if (err) throw err;
console.log('重命名完成');
});
fs.stat('/tmp/world', (err, stats) => {
if (err) throw err;
console.log(`文件属性: ${JSON.stringify(stats)}`);
});
- 要正确地排序这些操作,则将 fs.stat() 调用移动到 fs.rename() 操作的回调中:
fs.rename('/tmp/hello', '/tmp/world', (err) => {
if (err) throw err;
fs.stat('/tmp/world', (err, stats) => {
if (err) throw err;
console.log(`文件属性: ${JSON.stringify(stats)}`);
});
});
- 在繁忙的进程中,强烈建议使用这些调用的异步版本。 同步的版本将阻塞整个进程,直到它们完成(停止所有连接)。
- 虽然不推荐这样使用,但大多数 fs 函数允许省略回调参数,在这种情况下,使用一个会重新抛出错误的默认回调。 要获取原始调用点的跟踪,则设置 NODE_DEBUG 环境变量:不推荐在异步的 fs 函数上省略回调函数,因为可能导致将来抛出错误
$ cat script.js
function bad() {
require('fs').readFile('/');
}
bad();
$ env NODE_DEBUG=fs node script.js
fs.js:88
throw backtrace;
^
Error: EISDIR: illegal operation on a directory, read
<stack trace.>
文件内容读取-readFile
异步格式:
fs.readFile('文件路径'[,选项], (err, data) => {
if (err) throw err;
console.log(data);
});
说明:
- 第一个参数:文件路径。 相对路径和绝对路径均可。
- 第二个参数: 配置项,可选参数。主要用来配置字符集。一般可设置为'utf8'
- 如果不设置该参数,文件内容会以二进制形式返回。
- 参数3: 读取完成后触发的回调函数。有两个参数 --- err 和 data
- 读取成功
- err: null
- data: 文件内容,如果不设置参数2,则返回二进制数据。可以使用 toString() 方法将二进制数据 转为正常字符串
- 读取失败
- err: 错误对象
- data: undefined
- 读取成功
const fs = require("fs")
fs.readFile('文件路径',"utf8", (err, data) => {
if (err) throw err;
console.log(data);
});
同步格式: 与异步格式不同在于:
- api的名字后面有Sync
- 不是通过回调函数来获取值,而是像一个普通的函数调用一样,直接获取返回值
const fs = require("fs")
let rs = fs.readFileSync('文件路径',"utf8");
console.log(rs)
文件写入
覆盖写入 writeFile
功能:向指定文件中写入字符串(覆盖写入), 如果没有该文件则尝试创建该文件。它把把文件中的内容全部删除,再填入新的内容。
格式:fs.writeFile(var1, var2, var3, var4);
参数1: 要写入的文件路径 --- 相对路径和绝对路径均可,推荐使用绝对路径
参数2: 要写入文件的字符串
参数3: 配置项,设置写入的字符集,默认utf-8
参数4: 写入完成后触发的回调函数,有一个参数 --- err (错误对象)
const fs = require('fs')
fs.writeFile('./a.txt', 'hello world niahi \n asfsdf', err => {
if (err) {
console.info(err)
throw err
}
})
文件追加 appendFile
功能 :向指定文件中写入字符串(追加写入), 如果没有该文件则尝试创建该文件
格式:fs.appendFile(var1, var2, var3, var4);
参数1: 要写入的文件路径 --- 相对路径和绝对路径均可,推荐使用绝对路径
参数2: 要写入文件的字符串
参数3: 配置项,设置写入的字符集,默认utf-8
参数4: 写入完成后触发的回调函数,有一个参数 --- err (错误对象)
const fs = require('fs')
fs.appendFile('./a.txt', '\n 为天地立命', err => {
if (err) {
console.info(err)
throw err
}
})
路径问题
在读取文件时,写相对路径是容易出问题的。
- 我们在fs中读取文件时,使用的是相对路径,而相对路径的参考点是运行这个js文件的小黑窗的路径。而这个路径我们是可以通过cd命名来调整的。
解决方法,就是在操作文件时,使用绝对路径来定位文件。 __dirname __filename 获取绝对路径
绝对路径: 从磁盘根目录开始到指定文件的路径。
相对路径:是以某个文件的位置为起点,相对于这个位置来找另一个文件。
nodejs中提供了两个全局变量来获取获取绝对路径:
- __dirname:获取当前被执行的文件的文件夹所处的绝对路径
- __filename:获取当前被执行的文件的绝对路径

2.path模块
它是一个核心模块,用来处理路径问题:拼接,分析,取后缀名。
- path.basename(路径)获取
- path.join()
- path.parse(path) 转成一个对象

3.http模块
快速搭建服务器:
// http.js
// 引入核心模块http
const http = require('http');
// 创建服务
const server = http.createServer(function(req, res) {
console.log(req.connection.remoteAddress);
res.end('hello world');
});
// 启动服务
server.listen(8081, function() {
console.log('success');
});
- 在上面的代码中,我们通过http.createServer方法创建一个http服务。
// 创建服务
const server = http.createServer((req, res) => {
console.log(req.connection.remoteAddress);
res.end('hello world');
});
其中的参数是一个函数,这个函数是一个匿名函数,这个函数充当回调函数的角色,当有http请求时,它会自动被调用。
这个回调函数有它有两个参数。这两个参数非常重要,也非常复杂.
- 第一个参数表示来自客户端浏览器的请求,第二个参数用来设置对本次请求的响应。它们的形参名并不重要,但是,一般第一个参数名使用req或者request表示,第二个参数使用res或者resposne表示。
- 当某个客户端来请求这个服务器时,这个函数会自动调用,同时会自动给这两个参数赋值。第一个参数中包括本次请求的信息。
- req:请求
- req.url。本次请求的地址
- req.method。 获取请求行中的请求方法
- req.headers。 获取请求头
- req:请求
- 第二个参数用来设置本服务器对这次请求的处理。
- 这个参数一般命名是res,它是一个对象,其中有很多方法和属性。
- res.end()
- 把把本次的处理结果返回给客户端浏览器
- 如果不写这一句,则客户端浏览器永远收不到响应。
- res.setHeader() 设置响应头,比如设置响应体的编码 res.setHeader('content-type', 'text/html;charset=utf-8');
- res.statusCode 设置状态码
4.url模块
作用:url模块用来对url(例如:itcast.cn:80/schools/stu…
步骤:
- 引入 const url = require('url');
- 使用它的方法
- obj = url.parse(地址栏中输入的url)
let urlobj = url.parse(req.url); // urlobj对象中,就有我们需要的信息
urlobj.pathname :获取用户输入的url的路径名 ('/schools/students')
urlobj.search: '?id=18&name=zs',
urlobj.query: 获取用户输入的url中的查询字符串( 'id=18&name=zs' )
urlobj.path: '/schools/students?id=18&name=zs',
urlobj.href: '/schools/students?id=18&name=zs'
上面urlobj.query只是获得了传递的全部参数,我们一般还需从地址栏中分析传递的数据。即从 itcast.cn:80/schools/stu…
5.querystring模块
用来对url中的查询字符串这部分进行处理。nodejs中提供了querystring这个核心模块来帮助我们处理这个需求。
const qs= require('querystring');
let obj = qs.parse('id=18&name=zs');
console.log(obj)