Node.js
一、模块导入与导出
- 导入
require - 导出
module.exports={}
二、模块路径解析规则
require(/index.js)在文件根路径找require(./index.js)相对路径require('express')先看是不是内置模块,然后在nodeo_modules找,在上一级的node_modules找,一层一层往上找
三、初始化node包
npm init -y
四、fs文件模块
1.文件同步写入
const fs = require('fs');
// 打开文件
const fd = fs.openSync('test1.txt','w')
// 写入文件
fs.writeFileSync(fd, '你好,Nodejs')
// 退出文件
fs.closeSync(fd)
2.文件异步写入
const fs = require('fs');
// 打开文件
fs.open('test2.txt','w',(err,fd)=>{
console.log('打开文件');
// 写入文件
fs.writeFile(fd, '你好,Nodejs。',(err)=>{
if(!err){
console.log('写入完成');
// 退出文件
fs.close(fd,()=>{
console.log('文件关闭完成');
})
}
})
})
3.文件流写入
const fs = require('fs');
// 创建写入流
const ws = fs.createWriteStream('text3.txt');
// 监听通道打开
ws.once('open',()=>{
console.log('通道打开');
ws.write('你吃了吗')
ws.write('你喝了吗')
ws.write('你饱了吗')
// 写入结束
ws.end()
})
// 监听通道关闭
ws.once('close', () => {
console.log('通道关闭');
})
4.文件读取
const fs = require('fs');
fs.readFile('text3.txt',(err,data)=>{
if(!err){
console.log(data.toString());
}else{
console.log('err',err);
}
})
4.读取流
const fs = require('fs');
const rs = fs.createReadStream('text3.txt');
const ws = fs.createWriteStream('text5.txt');
// 创建管道,将读取流通过管道流出
rs.pipe(ws)
5.删除文件
const fs = require('fs');
// 删除文件
fs.unlink('demo.txt',(err)=>{
if(err){
console.log(err);
}else{
console.log('删除文件成功');
}
})
6.读取目录下的所有文件
const fs = require('fs');
fs.readdir('./',(err,files)=>{
if(err){
console.log(err);
}else{
console.log(files);
}
})
7.创建目录
const fs = require('fs');
// 创建文件夹
fs.mkdir('./img',(err)=>{
if (err) {
console.log(err);
} else {
console.log('创建成功');
}
})
8.删除空目录
const fs = require('fs');
//删除文件夹
fs.rmdir('./img',(err)=>{
if (err) {
console.log(err);
} else {
console.log('删除成功');
}
})
9.递归删除非空目录
const fs = require('fs');
function delDir(dirPath) {
let filesArr = fs.readdirSync(dirPath);
for (let i in filesArr) {
let filePath = dirPath + '/' + filesArr[i];
// 读取文件信息
let stat = fs.statSync(filePath);
// 判断是文件还是目录
if (stat.isFile()) {
fs.unlinkSync(filePath)
} else if (stat.isDirectory()){
// 递归调用自己
delDir(filePath);
}
}
//删除空目录
fs.rmdirSync(dirPath)
}
delDir('./img')
四、自定义node事件
const events = require('events');
// 创建事件对象
let eventLog = new events.EventEmitter();
// 监听事件
eventLog.on('lpMkDir',(msg)=>{
console.log('lp创建目录事件触发',`msg:${msg}`);
})
// 触发
eventLog.emit('lpMkDir','芜湖,起飞')
五、buffer缓冲区,用于读取或操作二进制数据流
// 将字符串放置到缓冲区
const b1 = Buffer.from('10')
console.log(b1,b1.toString());
// 初始化缓冲区,创建一个大小为10个字节的缓冲区
// 保证新创建的缓冲区数据是不会包含旧的数据
const b2=Buffer.alloc(10);
console.log(b2);
// 不回重置数据,不安全
const b3 =Buffer.allocUnsafe(10);
console.log(b3);
b3[0]='1'
console.log(b3, b3[0].toString());
六、多进程
exec
const child_process = require('child_process');
for (let i = 0; i < 3; i++) {
// stdout子进程输出的结果
// stderr子进程输出的错误
let workProcess = child_process.exec('node main1.js '+i,(err,stdout,stderr)=>{
if(err){
console.log(err);
}else{
console.log('stdout:',stdout);
console.log('stderr:',stderr);
}
})
workProcess.on('exit',(code)=>{
console.log('子进程已退出,退出码: '+code);
})
}
spawn
const child_process = require('child_process');
for (let i = 0; i < 3; i++) {
// stdout子进程输出的结果
// stderr子进程输出的错误
let workProcess = child_process.spawn('node',['main1.js',i]);
workProcess.stdout.on('data', (data) => {
console.log('data: ' + data);
})
workProcess.stderr.on('err', (err) => {
console.log('err: ' + err);
})
workProcess.on('close',(code)=>{
console.log('子进程已退出,退出码: '+code);
})
}
fork
const child_process = require('child_process');
for (let i = 0; i < 3; i++) {
// stdout子进程输出的结果
// stderr子进程输出的错误
let workProcess = child_process.fork('main1.js',[i]);
workProcess.on('close',(code)=>{
console.log('子进程已退出,退出码: '+code);
})
}
path
// 当前正在执行的脚本的文件名称
console.log(__filename);
// 当前正在执行脚本的目录名称
console.log(__dirname);
const path = require('path');
// 获取文件扩展名
console.log(path.extname(__filename));
// 获取文件名称
console.log(path.basename(__filename));
// 获取目录名称
console.log(path.dirname(__filename));
// 路径解析和规范化
console.log(path.normalize(__filename));
// 路径拼接
console.log(path.join(__dirname+'/lp.jpg'));
// 获取绝对路径的合并
console.log(path.resolve(__dirname + '/lp.jpg'));
HTTP模块搭建简易服务器
// 导入http模块
const http = require('http');
// 创建服务器实例
const serve = http.createServer();
// 监听请求
serve.on('request', (req, res) => {
console.log(req.url);
if(req.url=='/'){
res.end('index')
}else if(req.url=='/login'){
res.end('login')
}else{
res.end('not found')
}
})
// 绑定监听端口号
serve.listen(3000, () => {
console.log('服务器端口号:', 3000);
})
express搭建静态服务器和自定义接口
// 导入express框架
const express = require('express');
// 实例化服务器应用
const app = express();
// 实现静态服务器
app.use(express.static('static'));
// 实现自定义接口
app.get('/api/userList', (req, res) => {
// 请求的信息:req对象
// 响应的信息:res对象
res.json({
code: 'ok',
userList: [
{
username: '小明',
sex: '男'
},
{
username: '小白',
sex: '男'
},
{
username: '小黑',
sex: '女'
}
]
})
})
// 启动服务器
app.listen(3000, () => {
console.log('服务器端口号: ', 3000);
})