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);