Articles19
Tags0
Categories0

node.js

node.js

一.应用场景

web应用、api编写、中间层、微服务

二.工具

自动重启工具nodemon

安装:cnpm i nodemon –save

如果出现:

无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\nodemon.ps1

1).管理员身份打开powerShell

2).输入set-ExecutionPolicy RemoteSigned

3) 选择Y 或者A ,就好了

运行 :nodemon 文件名

三.一些常用API

1.模块:

const os=require('os')
const cpuStat=require('cpu-stat')

1)内建模块:

function showStatisties(){
  const men=os.freemem() / os.totalmem()*100
  console.log(`内存占用率${men}%`)
  //freeMem()是未占用的内存,totalmen是已经占用的内存

2)第三方模块

//CPU占用比
  cpuStat.usagePercent((err,percent)=>{
    console.log(`cpu占用率:${percent}`)
  })
}

3)自定义模块

const conf=require('./confi')
console.log(conf)
//如果没有覆盖导出,导入的时候需要结构化一下
const{rmbToDollar} =require('./current')(6)
//因为导出的是个函数,此处不仅引用,还调用这个函数,传入参数6
console.log(rmbToDollar(10))

confi文件:

//数据库配置
//模块导出

module.exports={
  url: 'mongodb://localhost:27017',
  dbName: 'test',
  user: 'admin',
  password: '123'
}

current.js

该文件导出的文件是个工厂函数(创建了一个类实例),工厂函数里面调用功能函数,实现一定的功能

let rate

//钱币转化
//功能函数
function rmbToDollar(rmb){
return rmb/rate
}
//工厂函数
module.exports=function(r){
  rate=r
  return{rmbToDollar}
}

2.文件读取写入与异步操作

readFileSync是个同步读取文件的函数,读取完毕才可以继续执行下面的代码

readFile可以异步读取文件,不会阻塞

将异步转化为同步的方法:

1)promise

2) generator

3) async await

const fs= require('fs')
// 读取一个文件
//这行代码没有执行完毕,后面的代码就不会执行
const data=fs.readFileSync('./confi.js')//阻塞操作
console.log('data1',data)

//异步版本
fs.readFile('./confi.js',(err,data)=>{
  console.log('data2',data)
})
console.log('其他操作')


//promise
//异步代码同步化
const {promisify}=require('util')
const readfile =promisify(fs.readFile)
readfile('./confi.js').then((data)=>{
console.log('data3',data)
})
//v10.0
//fs Promise Api
const {promises}=require('fs')
promises.readFile('./confi.js').then(data=>console.log('data4',data))

//generator
//async await

打印出来的顺序:data1 其他操作 data2 data3 data4

3.buffer

buffer是八位字节组成的数组,可以把有效的在js中存储二进制

buffer创建的方式有2种,第一种是Buffer.alloc(10),可以分配内存,此处是10个内存,每个内存2个字节(8位),,内容为空,第二种是由数据创建,Buffer.from([1,2,3]),创建的buffer分配的内存和内容和创建它的数据一样

写入的时候,若写入的内容大小超过它自身的,则超过的会被截断丢失

/创建buffer
const buf1=Buffer.alloc(10)//分配内存
console.log('buf1',buf1)
//由数据创建
const buf2=Buffer.from([1,2,3])
console.log(buf2)

//字符串,一个英文字母需要两个字节,默认的编码方式:utf8,一个汉字需要3个字节
const buf3=Buffer.from('hello,开课吧')
console.log('字符串buffer',buf3)

//写入,超过截断
buf1.write('hello')
console.log('op',buf1)

//读取
console.log('读取1',buf3.toString())//以默认的utf8读取,可读取中文字符
console.log('读取2',buf3.toString('ASCII'))

//合并,底层数据拼接原理
const buf4=Buffer.concat([buf1,buf3])
console.log(buf4.toString())

4.http

网络请求

如果输入的地址是‘/’(根路径)返回首页

const http=require('http')
const fs=require('fs')
const path=require('path')
http.createServer((req,res)=>{
console.log('来了一个请求')
if(req.url==='/'&&req.method==='GET'){
  //读取首页,path.resolve读取绝对地址
  console.log(path.resolve('./index.html'))
  fs.readFile(path.resolve('./index.html'),(err,data)=>{
    //错误处理
    if(err){
      res.statusCode=500
      res.end('500-reeor')
      return
    }
    //设置状态码
    res.statusCode=200;//请求成功
    res.setHeader('Content-type','text/html')//响应头
    res.end(data)
    res.end('服务器响应啦')
  })
  // res.end('服务器响应啦')
}else if(req.url==='/users'&&req.method==='GET'){
  //接口编写
  res.statusCode=200
  res.setHeader('Content-Type','application/json')
  res.end(JSON.stringify([{name:'ami',age:'12'}]))
  //序列化,变成字符串
  //返回的数据必须是string或buffer
}else if(req.headers.accept.indexOf('image/*')!==-1&&req.method==='GET'){
//如果请求的有图片(任意形式)
  console.log('url','.'+req.url)
  //搭个管道流向响应res,复制图片显示在页面上
fs.createReadStream('.'+req.url).pipe(res)
}

}).listen(3000)

index.html文件:

<!DOCTYPE html>
<html lang='en'>
  <head>
    <meta charset="UTF-8">
    <meta name='viewport'content="width=device-width,initial-scale=1.0">
    <meta http-equiv='X-UA-Compatible'content='ie=edge'>
    <title>souye</title>
  </head>
  <body>
    <h1>首页</h1>
    <img src='01.jpg'alt=''/>
  </body>
</html>

5.stream

流,用于node中流数据的交互接口

const fs=require('fs')
const rs=fs.createReadStream('./confi.js')//读取流
const ws=fs.createWriteStream('./confi2.js')//写入流

rs.pipe(ws);//管道,把写入流和读取流连接 读取流流入到写入流,相当与一个文件的复制操作

结果:生成confi2.js文件,内容和confi.js一样

对二进制友好,可以复制图片

const rs2=fs.createReadStream('./01.jpg')//读取流
const ws2=fs.createWriteStream('./02.jpg')//写入流
rs2.pipe(ws2)

6.express

安装express npm i express

以下案例包括两个方法:get和listen(监听端口)

const http=require('http')
const url=require('url')
//实现一个路由器的功能
let router=[];
//router用于存路径
class Application{
  //get的方法
  //构造路由对象
  get(path,handler){
    router.push({
      path,
      method:'get',
      handler
    })
    //放入router
  }
  listen(port){
//创建server
   http.createServer((req,res)=>{
   let {pathname}=url.parse(req.url,true)
   //url.parse(req.url,true)生成一个对象
   //遍历路由,找到路径并确定在router
   for(const route of router){
 if(route.path===pathname){
 //handler是相关处理方法
   route.handler(req,res)
   return
 }
   }
   }).listen(...arguments)
  }

}
//app是Application的实例
module.exports=function name(config){
  return new Application();
}

应用:

express.test.js

以app实例去请求,不需要用if语句去判断路径和方法,直接请求对应路径

此处以首页请求为例

const express=require('express')
const fs=require('fs')
const path=require('path')

const app=express()
app.get('/',(req,res)=>{
  //读取首页,path.resolve读取绝对地址
  console.log(path.resolve('./index.html'))
  fs.readFile(path.resolve('./index.html'),(err,data)=>{
    //错误处理
    if(err){
      res.statusCode=500
      res.end('500-reeor')
      return
    }
    //设置状态码
    res.statusCode=200;//请求成功
    res.setHeader('Content-type','text/html')//响应头
    res.end(data)
    res.end('服务器响应啦')
  })
})
//app可以监听该地址,一旦监听到,就执行函数
app.listen(3000)
Author:shuo
Link:http://yoursite.com/2019/10/25/node.js/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可