nodeJS基础操作
- 读取内存占用率
- 第三方插件使用方法(git下载插件、loading插件)
- Promise使用方法(在第2条中有使用)
- 同步、异步调用文件
- 启动一个3000端口的本地服务
- 页面读取、未找到路由404页面、接口调用返回json、steam流处理图片css等(都在第5条里面实现了)
- 文件流
- 埋点 让埋点更简单 const img = new Image(); img.src = ‘/api/users?abc=123’ 下面没有更多相关内容了,第七点over。
// 1. 读取内存占用率
const os = require("os")
const men = os.freemem() / os.totalmem() *100;
console.log(`内存占用率${men.toFixed(2)}%`)
// 2. 第三方插件使用方法(git下载插件、loading插件)
// const download = require('download-git-repo');
// const ora = require('ora'); //loading效果插件
// const process = ora(`🔥下载git项目`)
// process.start()
// download('github:su37josephxia/vue-template', 'test', err => {
// if (err) {
// process.fail();
// } else {
// process.succeed();
// }
// })
// 3. Promise使用方法(在第2条中有使用)改造上面git下载回调为promise方式,避免后期回调地狱
const repo = 'github:su37josephxia/vue-template';
const desc = '../test';
clone(repo, desc);
async function clone(repo, desc) {
const { promisify } = require('util');
const download = promisify(require('download-git-repo'));
const ora = require('ora'); //loading效果插件
const process = ora(`🔥下载git项目`)
process.start();
try {
await download(repo, desc);
console.log('成功')
process.succeed();
} catch(error) {
console.log('失败',error)
process.fail()
}
}
// 4. 同步、异步调用文件 fs
const fs = require('fs');
// 同步调用文件 文件操作
const data = fs.readFileSync('download.js');
// console.log(data);
// 异步调用文件 文件操作
fs.readFile('./download.js', (err, data) => {
if (err) throw err;
// console.log('读取文件成功:',data.toString());
})
// 上面读取到的文件会以buffer格式读取,下面是buffer的基本操作
const buf1 = Buffer.alloc(10); //分配一个10字节的buffer空间
console.log(buf1); //<Buffer 00 00 00 00 00 00 00 00 00 00>
const buf2 = Buffer.from('a');
console.log(buf2); //<Buffer 61>
const buf3 = Buffer.from('中');
console.log(buf3); //<Buffer e4 b8 ad>
const buf4 = Buffer.concat([buf2, buf3]); //合并两个Buffer
console.log(buf4) //<Buffer 61 e4 b8 ad>
console.log(buf4.toString()) //a中 (Buffer格式可以通过toString()转为正常格式)
// 5. 启动一个3000端口的本地服务 启动一个3000端口的本地服务 start -------
const http = require('http');
const server = http.createServer((request, response) => {
// console.log(getPrototypeChain(response)); //// 获取对象的原型链
const { url, method, headers } = request;
console.log(233333,url)
if (url === '/' && method === 'GET') {
console.log('333333')
fs.readFile('../index.html', (err, data) => {
// console.log(data.toString()) // html页面代码
if (err) {
response.writeHead(500, {
'Content-Type': 'text/plain;charset=utf-8'
})
response.end('500 服务器错误')
}
response.statusCode = 200;
response.setHeader('Content-Type', 'text/html');
response.end(data)
})
} else if (url === '/users' && method === 'GET') {
response.writeHead(200, { 'Content-Type': 'application/json' })
response.end(JSON.stringify({name:'Leo'}))
} else if (method === 'GET' && headers.accept.indexOf('image/*') !== -1) {
// console.log(url, headers)
fs.createReadStream('../' + url).pipe(response)
} else {
response.statusCode = 404;
response.setHeader('Content-Type', 'text/plain;charset=utf-8');
response.end('404 页面没有找到')
}
});
server.listen(3000);
// 获取对象的原型链
function getPrototypeChain(obj) {
var result = [],
proto = obj;
while(proto != null) {
proto = Object.getPrototypeOf(obj);
if(proto != null) {
result.push(proto);
obj = proto;
}
}
return result;
}
// 启动一个3000端口的本地服务 end -------
// 7. 文件流 文件流处理 读取activity-2.png 生成了个activity-2s.png的新文件(2个导管,文件1个字节一个字节的由rsImg 通过pipe导管 流入 wsImg,建立复制流入关系。不会占用太大内存资源)
const rsImg = fs.createReadStream('../image/activity-2.png');
const wsImg = fs.createWriteStream('../image/activity-2s.png')
rsImg.pipe(wsImg); // 建立pipe导管,让rsImg可以和wsImg建立字符复制流关系
// 问题1:fs.createReadStream('../' + url).pipe(response); 为什么pipe管道联通response