文章目录
f s 模块
fs.stat()
检测是文件还是目录
fs.stat('./html', (err,data) => {
if(err) {
console.log(err)
return;
}
console.log(data);
console.log(`是文件:${data.isFile()}`)
console.log(`是目录:${data.isDirectory()}`);
})
fs.mkdir()
创建目录
/*
path 将要创建的目录路径
mode 目录权限 (读写权限) , 默认777
callback 回调, 传递异常参数err
*/
fs.mkdir('./css', (err) => {
if(err) {
console.log(err)
return;
}
console.log('创建成功');
})
fs.writeFile()
创建并写入文件
/*
filename (String) 文件名称
data (String | Buffer) 将要写入的内容 可以是字符串或buffer数据
options (Object) option数组对象,包含:
1.encoding (string) 可选值, 默认 'utf8',当 data 是 buffer时,
2.mode (Number) 文件读写权限, 默认值 438
3.flag (String) 默认值 'w'
callback {function} 回调, 传递一个异步参数err
*/
fs.writeFile('./html/index.html', '你好nodejs', (err) => {
if(err) {
console.log(err)
return;
}
console.log('创建写入文件成功');
})
// 注意 :: 当没有要写入的这个文件时创建文件并写入,如果这个文件已经存在了,写入的内容将覆盖原先的文件内容
fs.appendFile()
追加文件
fs.appendFile('./css/base.css', 'body{color:red}', (err) => {
if(err) {
console.log(err)
return;
}
console.log('appendFile 成功');
})
//与writeFile() 功能相同, 不同的是 appendFile()是追加文件
fs.readFile()
读取文件
fs.readFile('./html/index.html', (err,data) => {
if(err) {
console.log(err)
return;
}
console.log(data.toString()) //把Buffer 转化成string类型
})
fs.readdir()
读取目录
fs.readdir('./html', (err, data) => {
if(err) {
console.log(err)
return;
}
console.log(data);
})
fs.rename()
重命名
//原名 原路径 //现名 现路径
fs.rename('./css/aaa.css','./css/index.css', (err) => {
if(err) {
console.log(err)
return;
}
console.log('重命名成功');
})
fs.rmdir
删除目录
fs.rmdir('./aaaa', (err) => {
if(err) {
console.log(err)
return;
}
console.log('删除目录成功');
})
fs.unlink()
删除文件
fs.unlink('./aaaa/index.html', (err) => {
if(err) {
console.log(err)
return
}
console.log('删除文件成功');
})
// 删除文件夹,首先要先删除文件夹里面的文件 (先 unlink 后 fs.rmdir)
案例:
创建 upload目录
const fs = require('fs')
var path = './upload'
fs.stat(path, (err, data) => {
// err 没有这个文件
if(err) {
mkdir(path)
return;
}
//有这个文件时: 判断是文件类型还是目录类型
// 文件类型: 1.删除该文件,执行成功后,创建目录
if(!data.isDirectory) {
fs.unlink(path, (err) => {
if(!err) {
mkdir(path)
} else {
console.log('请检测传入的数据是否正确');
}
})
}
})
function mkdir(file) {
fs.mkdir(file, (err) => {
if(err) {
console.log(err)
return;
}
console.log('创建目录成功');
})
}
wwwroot 文件夹下面有images css js 以及 indexedDB.html, 找出 wwwroot 目录下面的所有目录, 放到一个数组中
fs.readdir('./wwwroot', (err,data) => {
if(err) {
console.log(err)
return;
}
console.log(data);
})
// 解决异步问题
// 1. 改造for循环 2. node.js里面的新特性 async await
const path = './wwwroot'
const dirArr = []
fs.readdir(path,(err,data) => {
if(err) {
console.log(err)
return;
}
// =============异步解决办法一=================
(function getDir(i) {
if(i == data.length) {
console.log(dirArr)
return;
}
fs.stat(path+'/'+data[i], (error,stats) => {
if(stats.isDirectory()) {
dirArr.push(data[i])
}
getDir[i+1]
})
})(0)
// ==============这样写会出现异步================
//for(var i =0; i<data.length;i++) {
// fs.stat(path+'/'+data[i], (error,stats) => {
// if(stats.isDirectory()) {
// dirArr.push(data[i])
// })
//}
//console.log(dirArr)
// ============================================
})
异步解决办法二
async await
async function test() {
return new Promise((resolve, reject) => {
setTimeout(function () {
var name = '张三 222'
resolve(name)
},1000)
})
}
async function main() {
var data = await test()
console.log(data);
}
async function isDir(path) {
return new Promise((resolve, reject) => {
fs.stat(path, (error, stats) => {
if(error) {
console.log(error)
reject(error)
return;
}
if(stats.isDirectory()) {
resolve(true)
} else {
resolve(false)
}
})
})
}
function main() {
var path = './wwwroot'
var dirArr = []
fs.readdir(path,async(err, data) => {
if(err) {
console.log(err);
return
}
for(var i=0; i<data.length; i++) {
if(await isDir(path + '/' + data[i])) {
dirArr.push(data[i])
}
}
console.log(dirArr);
})
}
main()
从文件流中读取数据
fs.createReadStream
const fs = require('fs')
var readStream = fs.createReadStream('./data/input.txt')
var count = 0;
var str = '';
readStream.on('data', (data) => { //监听
str += data
count++
})
readStream.on('end', () => { //读取结束
console.log(str)
console.log(count);
})
readStream.on('error', (err) => { //报错
console.log(err);
})
fs.createWriteStream
// 从文件流中读取数据
const fs = require('fs')
var str = ''
for(var i = 0; i < 503; i++) {
str+='我是从数据库获取的数据, 我要保存起来\n'
}
var writeStream = fs.createWriteStream('./data/output.txt')
writeStream.write(str); //写入数据了
//标记写入完成
writeStream.end()
//标记写入完成 监听写入完成情况前必须标记写入完成
writeStream.on('finish', () => {
console.log('写入完成');
})
readStream.pipe()
//管道流 用于复制文件
const fs = require('fs')
var readStream = fs.createReadStream('./aaa.jpg')
var writeStream = fs.createWriteStream('./data/aaa.jpg')
readStream.pipe(writeStream)
静态资源方法
./module/routes.js 里面
const fs = require('fs')
const path = require('path');
const url = require('url')
// 私有方法
let getFileMime = function (extname) {
// 方法一:
// return new Promise((resolve, reject) => {
// fs.readFile('./data/mime.json', (err,data) => {
// if(err) {
// console.log(err);
// reject(err)
// return;
// }
// let mimeObj = JSON.parse(data.toString())
// console.log(mimeObj[extname]);
// resolve(mimeObj[extname])
// })
// })
// 方法二:
var data = fs.readFileSync('./data/mime.json') //同步方法
let mimeObj = JSON.parse(data.toString())
return mimeObj[extname]
}
exports.static = function (req, res, staticPath) {
// 1. 获取地址
// let pathname = req.url
let pathname = url.parse(req.url).pathname
pathname = pathname == '/' ? '/index.html' : pathname
//获取后缀名
let extname = path.extname(pathname)
// 2. 通过fs模块读取文件
if(pathname != '/favicon.ico') {
fs.readFile('./'+ staticPath + pathname, (err,data) => {
if(err) {
res.writeHead(404, {'Content-Type': 'text/html;charset="utf-8"'});
res.end('404这个页面不存在')
}
let mime = getFileMime(extname)
res.writeHead(200, {'Content-Type': ''+mime+';charset="utf-8"'})
res.end(data);
})
}
}
// 三元运算分的基本格式 : 条件?真结果:假结果
// 三元表达式是如何对应if…else语句的?
// 条件 ? 真结果 : 假结果
// if(条件){真结果}else{假结果}
// 三元表达式的局限性
// 最后,大家注意,三元表达式在使用过程中不能使用break,continue等语句。否则…
./app03.js 里面
const http = require('http');
const routes = require('./module/routes')
http.createServer(function (req,res) {
routes.static(req, res, 'static')
}).listen(3000);
console.log('Server running at http://127.0.0.1:3000/');
路由
路由 是由一个 URL 和一个特定的 HTTP 方法组成的,涉及到应用如何响应客户端对某个网站节点的访问.
即 : 针对不同请求的URL, 处理不同的业务逻辑
http.createServer(function (req,res) {
routes.static(req, res, 'static')
let pathname = url.parse(req.url).pathname
if(pathname == '/login') {
res.writeHead(200, {'Content-Type': 'text/html;charset="utf-8"'})
res.end("执行登录")
} else if(pathname == '/register') {
res.writeHead(200, {'Content-Type': 'text/html;charset="utf-8"'})
res.end("执行注册")
} else if(pathname == '/admin') {
res.writeHead(200, {'Content-Type': 'text/html;charset="utf-8"'})
res.end("处理后的业务逻辑")
} else {
res.writeHead(404, {'Content-Type': 'text/html;charset="utf-8"'})
}
}).listen(3000);