1、关于node
node.js是一个异步的事件驱动的JavaScript运行时
node.js特性:
- 非阻塞I/O
- 事件驱动
和前端比较:
- 语法不变,都是ECMA语法;
- 运行环境变了, 之前js运行在浏览器,nodejs 可以让js运行在服务端
- 所以操作对象变了,之前js是 ECMA+webAPI,操作DOM 和BOM;nodejs是ECMA+node的api 操作的是fs,http等
2、基本调试
命令行中
mkdir node-notes
cd node-notes
code .
node nodetest.js 运行js文件
为了调试方便,使用nodemon 可以监视文件改动,自动重启,安装完后 nodemon nodetest.js
运行下文件
npm i -g nodemon
nodemon nodetest.js
3、vscode 中 debugger
在js文件中打一个断点,然后点击左侧小爬虫标志后点击‘添加配置-nodejs’,会生成一个debugger的配置文件,点击run 后就会执行到打断点处暂停,然后单步跳出
也可以使用log日志,debugger是个截断的过程,只能手动调试,影响效率
4、模块导入导出
- 引用node内置模块 - 看内存的占用率
const os = require('os');
// os 模块,可以用来看内存的占用率
const mem = os.freemem()/os.totalmem()*100
// os.freemem() 空置的时候 / totalmen()总的 = 就是内存占用率 *100 就是百分比形式
console.log(`内存占用率是${mem}%`);
- 引用第三方模块 - 看cpu数据
cpu 数据也可以用node的模块查看,不过比较复杂,我们可以引用一个第三方的库cpu-stat
npm init -y #生成package.json 方便
npm i cpu-stat -S #安装
const cpuStat = require('cpu-stat');
cpuStat.usagePercent((err,percent)=>{
//注意:nodejs里回调一般都是第一个参数err,第二个参数success
console.log(`cpu占用${percent}%`);
})
- 引用自己定义的模块
引入自定义模块要用相对路径
const getState = require('./getState.js');
setInterval(getState,1000);
const os = require('os');
// os 模块,可以用来看内存的占用率
const cpuStat = require('cpu-stat');
//cpu 数据也可以用node的模块查看,不过比较复杂,我们可以引用一个第三方的库cpu-stat
module.exports = function getState() {
const mem = os.freemem() / os.totalmem() * 100;
// os.freemem() 空置的时候 / totalmen()总的 = 就是内存占用率 *100 就是百分比形式
console.log(`内存占用率是${mem}%`);
cpuStat.usagePercent((err, percent) => {
//注意:nodejs里回调一般都是第一个参数err,第二个参数success
console.log(`cpu占用${percent}%`);
});
}
也可以
module.exports = function() {} //匿名形式 导出
const getState = require('./getState.js'); //导入
-------------------
module.exports = function getState() {} //具名形式 导出
const getState = require('./getState.js'); //导入
----------------
module.exports.getState = function() {} //匿名形式 导出
const {getState} = require('./getState.js'); //导入
---------------
module.exports = {
getState() {
//xxx
}
}
const {getState} = require('./getState.js'); //导入
5、fs 文件模块
- 同步方式读文件
const fs = require('fs');
const data = fs.readFileSync('package.json'); //sync同步方式
console.log(data);
打印出来是buffer,读文件是以2进制的形式读出来的,可以使用buffer对象的toString()方法 转成字符串, 没有参数的话,默认使用的utf-8, toString(‘utf-8’)
- 异步方式读文件
- 回调函数:
const fs = require('fs');
fs.readFile('./package.json',(err,data)=>{ //异步方式,回调
console.log(data.toString());
})
- 包装成promise
用node里util中的promisify方法包装下fs.readFile
,使其返回的是一个promise
这样就可以用then
了,而不用回调函数
const fs = require('fs');
const {promisify} = require('util'); //1..nodejs 自己的util包
const readFile = promisify(fs.readFile); //2..包装处理fs.readFile 为promise
readFile('./package.json').then(data=>{ //3..异步后then
console.log(data.toString());
})
- async、await
写await 必须放在 立即执行函数中 加async的函数里(async ()=>{ const data = await 异步操作})()
(async ()=>{ //1..立即执行函数中 加async的函数里
const {promisify} = require('util'); //nodejs 自己的util包
const readFile = promisify(fs.readFile); //包装处理fs.readFile 为promise
const data = await readFile('./package.json'); //2..异步函数前加 await
console.log(data.toString());
})()
6、buffer
buffer 用来处理二进制数据,因为从文件系统里拿出基本都是二进制的
//分配空间
const buf1 = Buffer.alloc(10); //分配了一个内存空间,用来存储二进制函数,10是10个字节,00 是1个字节
console.log('buf1:',buf1);
//创建
const buf2 = Buffer.from([1,2,3]); // 进行一个二进制赋值,打印出来是01 02 03 不是123 而是二进制的123
console.log('buf2:',buf2);
const buf3 = Buffer.from('Buffer创建方法');
console.log('buf3:',buf3.toString()); //toString() 将buffer转为字符串
//写入
buf1.write('hello'); //buffer写入
console.log('buf1写入后:',buf1);
//拼接
const buf4 = Buffer.concat([buf1,buf3]); //buffer拼接
console.log('buf4:',buf4.toString()); //还有个 buf.toJson()方法
7、http
- 简单结构
const http = require('http'); //1..引入http模块
const server = http.createServer((req,res)=>{ //2..创建一个服务器,请求服务器的时候,触发这里的函数
const {url,method} = req; //4..解构得到请求信息
res.end(url); //5..服务端返回的内容
})
server.listen(3000); //3..监听的端口
- 返回一个html文件内容
const http = require('http');
const fs = require('fs'); //1..引入文件模块,用来读取index.html
const server = http.createServer((req,res)=>{ //2..请求服务器的时候,触发这里的函数
const {url,method} = req;
if(url === '/' && method === 'GET'){ //3..判断链接是/的话
fs.readFile('./index.html',(err,data)=>{ //4..读取文件
if(err){ //5..如果读文件报错
res.writeHead('500',{'Content-Type':'text/plain;charset=utf-8'}); //500 是服务端错误, 内容类型是解释语句
res.end('服务端错误'); //返回中文的话要在上面写utf-8
return;
}
//6..如果没有错误
res.statusCode = 200; //返回状态码200,表示请求成功
res.setHeader('Content-Type','text/html'); //内容是html
res.end(data.toString()); //返回的是读取到的数据
})
}
})
server.listen(3000); //3..监听的端口
- 返回一个ajax请求
const http = require('http'); //1..引入http模块
const fs = require('fs'); //引入文件模块,用来读取index.html
const server = http.createServer((req,res)=>{ //2..创建一个服务器,请求服务器的时候,触发这里的函数
const {url,method} = req; //4..解构得到请求信息
if(url === '/' && method === 'GET'){ //判断链接是/的话,请求html文件
fs.readFile('./index1.html',(err,data)=>{ //读取文件
if(err){ //如果读文件报错
res.writeHead(500,{'Content-Type':'text/plain;charset=utf-8'}); //500 是服务端错误, 内容类型是解释语句
res.end('服务端错误');
return;
}
//如果没有错误
res.statusCode = 200; //返回状态码200,表示请求成功
res.setHeader('Content-Type','text/html'); //内容是html
res.end(data.toString()); //返回的是读取到的数据
})
} else if (url === '/user' && method === 'GET') { //如果请求/user,
res.writeHead(200,{'Content-Type':'application/json'}); //返回的类型是json
res.end(JSON.stringify({name:'lxz'})); //将json转为字符串
}
})
server.listen(3000); //3..监听的端口