NodeJS模块使用和其他
一. fs模块
-
fs
模块提供了用于与文件系统进行交互的 API。 -
使用模块要先导包
const fs = require('fs');
-
文件系统操作都具有同步和异步的形式
-
异步的形式总是把完成回调作为其最后一个参数,第一个参数预留给异常。 如果操作被成功地完成,则第一个参数会为
null
或undefined
// 导包 const fs = require('fs'); // 调用unlink删除方法 fs.unlink('./test/hello.txt', (err) => { if (err) throw err; // 如果出现异常就抛出异常 console.log('已成功地删除文件'); });
-
同步的操作时,发生的异常会立即地抛出,可以使用
try…catch
处理,也可以冒泡// 导包 const fs = require('fs'); try { fs.unlinkSync('./test/hello.txt'); console.log('已成功地删除文件'); } catch (err) { // 处理错误 }
-
-
fs模块读文件
const fs = require('fs'); fs.readFile('./test/hello.txt', 'utf-8', (err, data) => { if (err) throw err; console.log(data); });
readFile(
path[, options], callback
) 方法读文件第一个参数:文件的路径
第二个参数:可选,读取文件的编码格式
第三个参数:回调函数
- 第一个参数:异常
- 第二个参数:读取到的文件内容
-
fs模块写文件
const fs = require('fs'); const data = ` 将进酒 李白 君不见黄河之水天上来, 奔流到海不复回。 君不见高堂明镜悲白发, 朝如青丝暮成雪。 人生得意须尽欢, 莫使金樽空对月。 天生我材必有用, 千金散尽还复来.... `; fs.writeFile('./test/hello.txt', data, (err) => { if (err) throw err; console.log('文件已被保存'); });
writeFile(
file, data[, options], callback
)方法写文件第一个参数:文件的路径
第二个参数:要写入的内容
第三个参数:可选,文件的编码格式
第四个参数:回调函数
- 写入时会覆盖原有内容
- 如果没有文件会自动创建
- 如果没有文件夹会报错
二. 同步异步的区分
-
同步:
console.log('正在运行中'); for(let i = 0; i< 10;i++){ console.log(i); } console.log('运行完毕'); /* 执行结果: 正在运行中 0 1 2 3 4 5 6 7 8 9 运行完毕 */
-
同步的读文件
console.log('前面的执行'); const fs = require('fs'); try { let data = fs.readFileSync('./test/hello.txt', 'utf-8'); console.log(data) } catch (err) { console.log('发生错误'); } console.log('后面的执行'); /* 执行结果: 前面的执行 你好,这是一段测试文字. 后面的执行 */
-
-
异步:
console.log('前面的执行'); setTimeout(()=>{ console.log('定时器执行'); }, 2000); console.log('后面的执行'); /* 运行结果: 前面的执行 后面的执行 定时器执行 */
-
异步的读文件
console.log('前面的执行'); const fs = require('fs'); fs.readFile('./test/hello.txt', 'utf-8', (err, data) => { if (err) throw err; console.log(data); }); console.log('后面的执行'); /* 运行结果: 前面的执行 后面的执行 你好,这是一段测试文字. */
-
-
同步和异步的区别
-
同步:自上而下按顺序一个个来,执行完一个才能进行下一个
-
异步:谁先执行完谁先来。会把异步的都放入一个事件队列(任务队列)中,然后进行事件循环,一直监听当有事件执行完了就输出
-
程序会先执行同步代码然后去执行异步代码.
-
例子:
var t = true; setTimeout(()=>{ t = false; },1000); while(t){} alert('end');
上面的代码因为先执行同步后执行异步的原因会一直卡在while循环。
-
三. 相对路径和绝对路径
-
相对路径是相对于运行框的路径而言的
// 导包 const fs = require('fs'); fs.readFile('./test/hello.txt', 'utf-8', (err, data) => { if (err) throw err; console.log(data); });
这里的路径就是相对路径,以.开始
-
绝对路径
const fs = require('fs'); fs.readFile('C:\\Users\\韶音XH\\Desktop\\HTML\\nodejs\\test\\hello.txt', 'utf-8', (err, data) => { if (err) throw err; console.log(data); });
此路径是绝对路径
- 为了防止转义要用
\\
或者/
- 为了防止转义要用
-
__dirname
和__filename
console.log(__dirname); // c:\Users\韶音XH\Desktop\HTML\nodejs\模块使用和其他 console.log(__filename); // c:\Users\韶音XH\Desktop\HTML\nodejs\模块使用和其他\路径问题.js
__filename
: 获取到的是当前文件的绝对路径__dirname
:获取的是当前文件所在的文件夹的绝对路径 -
绝对路径更好的写法
const fs = require('fs'); // 用__dirname来拼接绝对路径,解决不同客户端的兼容问题 var filePath = __dirname + '\\test\\hello.txt'; fs.readFile(filePath, 'utf-8', (err, data) => { if (err) throw err; console.log(data); });
四. 其他模块
1. path模块
-
要先导入包
const path = require('path');
-
path.join:用来拼接字符串,组成路径
const path = require('path'); let filePath = path.join(__dirname, 'test','hello.txt'); console.log(filePath); // c:\Users\韶音XH\Desktop\HTML\nodejs\模块使用和其他\test\hello.txt
-
用path.join拼接的路径来读文件
const fs = require('fs'); var filePath = path.join(__dirname, 'test','hello.txt'); fs.readFile(filePath, 'utf-8', (err, data) => { if (err) throw err; console.log(data); });
2. http模块
-
用来搭建一个服务器
// 导入模块 const http = require('http'); // 创建一个服务器 const server = http.createServer((require,response)=>{ // 设置返回给用户看的内容 response.end('你好,这是一段测试文字'); }) // 开启服务器 server.listen(8087,()=>{ console.log('服务器开启了:8087') })
- 首先要导入模块
- 创建一个服务器
- 设置返回内容
- 开启服务器
-
如果要返回中文,要设置响应头。不然会乱码
// 导入模块 const http = require('http'); // 创建一个服务器 const server = http.createServer((require,response)=>{ // 设置返回给用户看的内容 // 设置响应头 response.setHeader('Content-Type', 'text/html;charset=utf-8'); response.end('你好,这是一段测试文字'); }) // 开启服务器 server.listen(8087,()=>{ console.log('服务器开启了:8087') })
五. 第三方模块的安装和使用
一. 第三方模块安装
- 首先新建一个空文件夹,名不要用中文。
- 用终端进入文件夹,输入npm init -y 进行初始化
- 去npm官网找需要的模块下载,然后就可以按照说明使用了
- 如果下载时出错可以试试清除缓存再下,命令npm cache clean -f
- 如果下载慢可以设置淘宝源:npm config set registry https://registry.npm.taobao.org
-
示例,用Crawler爬网站的title
var Crawler = require("crawler"); var c = new Crawler({ maxConnections: 10, callback: function (error, res, done) { if (error) { console.log(error); } else { var $ = res.$; console.log($("title").text()); } done(); } }); c.queue('http://www.baidu.com');
-
扩展: npm i 可以根据paclage.json文件自动下载当前文件里所有包
二. Express模块的使用
可以简单的创建服务器
官网:https://www.expressjs.com.cn/
-
创建服务器
// 导入模块 const express = require('express') // 创建服务器 const app = express() // 设置返回内容 app.get('/', function (req, res) { // express模块创建服务器用res.send()相应 res.send('Hello World') }) // 开启服务器 app.listen(8088,()=>{ console.log('服务器已开启') })
-
创建静态服务器
/** * 使用express创建静态服务器 */ // 导入模块 const express = require('express') // 创建服务器 const app = express(); // 对外开放访问 app.use(express.static('www')); // 开启服务器 app.listen(8088, () => { console.log('服务器已开启') })
app.use(express.static(‘www’));
此代码可以将www目录下的图片、css文件、html文件等对外开放。直接就可以访问了
-
express实现get接口
// 导包 const express = require('express'); // 创建服务器 const app = express() // 接口 app.get('/week',(req, res)=>{ let arr = ['星期一', '星期二', '星期三', '星期四','星期五'] let index = Math.floor(Math.random()*3); // 0 1 2 res.send(arr[index]) }) // 开启服务器 app.listen(8080,()=>{ console.log('服务器已开启') })
-
express返回json文件
// 接口 app.get('/dog', (req, res) => { // 设置响应内容 res.send({ dogName: '哈士奇', virtue: '运动量大,爱拆家', color: '黑白相间' }) })
-
express实现带参数的get接口
app.get('/getBookName', (req, res) => { // 接收数据 console.log(req.query); let allbookName = ''; switch(req.query.bookName){ case '三国': allbookName = '三国演义'; break case '红楼': allbookName = '红楼梦'; break case '西游': allbookName = '西游记'; break case '水': allbookName = '水浒传'; break } // 设置响应内容 res.send(allbookName) })
-
express实现post接口
app.post('/test', (req, res) => { res.send('测试post接口'); })
把get换成post即可,很简单
-
express实现带参数的post接口
// 导包 const express = require('express'); const bodyParser = require('body-parser') // 创建服务器 const app = express() // 转换格式 app.use(bodyParser.urlencoded({ extended: false })) // 接口 app.post('/login', (req, res) => { // 用req.body获取参数 console.log(req.body); if(req.body.name == 'calamity' && req.body.password == '10086'){ res.send({ code:200, msg:'登录成功' }) }else{ res.send({ code: 400, msg: '用户名或密码错误' }) } res.send('测试post接口'); }) // 开启服务器 app.listen(8080, () => { console.log('服务器已开启') })
获取post的参数要用第三方模块body-parser用req.body获取参数
-
express实现带传文件的post接口
// 导包 const express = require('express'); const bodyParser = require('body-parser'); var multer = require('multer'); // 创建服务器 const app = express() // 用包创建一个uploads文件夹 var upload = multer({ dest: 'uploads/' }) // 接口 app.post('/login', upload.single('usericon'), function (req, res, next) { // req.file 是 usericon文件的信息 // req.body 将具有文本域数据,如果存在的话 res.send('测试post接口'); }) // 开启服务器 app.listen(8080, () => { console.log('服务器已开启') })
post传文件要用第三方模块multer
- req.file 是 接收文件的信息
- req.body 将具有文本域数据,如果存在的话