nodejs快速上手

nodej是一个JavaScript运行环境(runtime)。它让JavaScript可以开发后端程序,它几乎能实现其它后端语言能实现的所有功能,nodejs最擅长处理高并发
在这里插入图片描述
我没有对各个模块进行相应的描述,而是直接使用代码,让你快速上手

HTTP、URL模块

  1. 创建一个web服务器
    http模块
//创建一个web服务器
//引入模块
var http = require('http')
/*
* req  获取客户端传过来的信息
* res  给浏览返回信息
* */

//调用函数
http.createServer((req,res) => {
//设置响应头部
res.writeHead(200,{"Content-Type":"text/plain"})
//返回数据
res.end("Hello World")
}).listen(8081)

console.log("Server running at http://127.0.0.1:8081/")
  1. 解析url地址
    url模块
//引入
const url = require('url')

//模拟请求
var api = 'http://www.cxq.com?name=cxq&age=21'

// console.log(url.parse(api))   解析地址
// console.log(url.parse(api,true))  解析地址,并且query变成对象
var getValue = url.parse(api,true).query

//获取请求的get传值
console.log(`姓名: ${getValue.name}----年龄: ${getValue.age}`)

http和url二者结合使用
获取网页的get传值

const http = require('http')   //引入模块
const url = require('url')

//创建服务器
http.createServer( (req,res) =>{
  //设置响应头部
  res.writeHead(200,{"Content-Type":"text/html;charset='utf-8'"}) //解决乱码
  res.write("<head><meta charset='UTF-8'/></head>") //解决乱码

  console.log(req.url)  //获取浏览器访问的地址

  if (req.url != '/favicon.ico'){
    var getValue = url.parse(req.url,true).query
    console.log(`姓名: ${getValue.name}----年龄:${getValue.age}`)
  } 
  

  res.end("你好,Node.js") //结束响应


}).listen(3001)  //监听端口

控制台会打印出你在浏览器中输入的?get传值

COMMONjs和Nodejs模块,自定义模块

COMMONjs就是一个模块化的标准,而这个标准的实现就是nodejs

  1. 模块的分类
    核心模块(内置模块): nodejs提供的模块,如http,url,path
    文件模块(自定义模块):用户自己编写的

  2. commonjs模块化标准
    我们可以把公共的功能抽离成一个单独的js文件作为一个模块,默认这个模块中的属性和方法是私有的,但可以通过exports和module.exports向外暴露
    有需要的时候模块之间可以通过require引入
    单独的一个函数一般使用exports暴露,module.exports一般用来暴露对象

  3. 在引入模块时,默认会寻找node_modules文件下的模块名下的index.js,这都是commonjs规定好的,可以通过配置文件package.json修改,package.json可以通过npm init生成
    在这里插入图片描述

const axios = require('axios')
const db  = require('db')
axios.get()
axios.post()
db.add()

包,npm,cnpm,第三方模块,package.json

  1. 包含有模块的就是包
  2. npm 是包管理工具,可以通过它往一个项目中添加或者删除包
  3. 别人写好的模块放到网上供我们随意使用的就是第三方模块,可以在npmjs官网寻找
  4. cnpm是淘宝镜像,在国内,下包速度更快
  5. package.json是项目的配置描述文件,很重要
    在这里插入图片描述

里面包含了对项目的一些描述,比如dependencies就是项目运行所必需的依赖,后面的数字就是依赖的版本号,^表示第一位版本号不变,后两位取最新,~表示前两位版本不变,后一位取最新,*表示全部取最新

我们可以通过npm(cnpm)下载和使用包,比如使用MD5实现加密的功能
项目中运行
npm install md5 --save 下载包
根据文档使用
npmjs官网

const md5 = require('md5')

//实现md5加密的功能
console.log(md5(123456))


//格式日期

console.log(new Date())

fs模块

fs模块实现了对文件的一系列操作,是nodejs中非常重要的部分

  1. 常用的方法
/*
* 1. fs.stat   检查是文件还是目录
* 2. fs.mkdir  创建目录
* 3. fs.writeFile 创建写入文件
* 4. fs.appendFile 追加文件
* 5. fs.readFile 读取文件
* 6. fs.readdir 读取目录
* 7. fs.reanme  重命名
* 8. fs.rmdir   删除目录
* 9. fs.unlink  删除文件
* */

const fs = require('fs')

// * 1. fs.stat   检查是文件还是目录
// fs.stat('./html',function (err,data) {
//   if(err){
//     console.log(err)
//     return
//   }
//   console.log(`是文件:${data.isFile()}`)
//   console.log(`是目录:${data.isDirectory()}`)
// })


// * 2. fs.mkdir  创建目录 再次创建会报错已存在
/*
* path    将创建的目录路径
* mode    目录权限(读写权限),默认777
* callback  回调,传递异常参数err
* */
// fs.mkdir('./css',err => {
//   if (err){
//     console.log(err)
//     return
//   }
//   console.log('创建成功')
// })


// * 3. fs.writeFile 创建并写入文件,再次写入的时候会替换
/*
* filename     文件名称
* data         数据
* options      option数组对象 ,包含:
*  . enconding  文件编码
*  . mode       文件读写权限,默认值438
*  . flag       默认值 w
* callback      回调函数
* */
// fs.writeFile('./html/index.html','你好,nodejs,好不好!',err =>{
//   if (err){
//     console.log(err)
//     return
//   } 
//   console.log('创建写入文件成功')
// })

// * 4. fs.appendFile 追加文件 不存在创建并写入,存在则追加
// fs.appendFile('./css/base.css','h2{color:red}',err =>{
//   if (err){
//     console.log(err)
//     return
//   } 
//   console.log('appendFile 成功!')
// })

// * 5. fs.readFile 读取文件
// fs.readFile('./html/index.html',(err,data) => {
//   if (err){
//     console.log(err)
//     return
//   }
//   console.log(data)  //默认是Buffer类型的数据
//   console.log(data.toString())
// })

// * 6. fs.readdir 读取目录 返回当前目录下所有的文件以及文件夹的数组
// fs.readdir('./html',(err,data) => {
//   if (err){
//     console.log(err)
//     return
//   }
//   console.log(data)
// })

// * 7. fs.reanme  重命名  修改名称 或者 达到移动文件的效果

// fs.rename('./css/aaa.css','./css/index.css',err => {
//   if (err){
//     console.log(err)
//     return
//   } 
//   console.log('重命名成功!')
// })

// fs.rename('./css/index.css','./html/index.css',err => {
//   if (err){
//     console.log(err)
//     return
//   }
//   console.log('移动成功')
// })

// * 8. fs.rmdir   删除目录
// fs.rmdir('./aaa',err =>{
//   if (err){
//     console.log(err)
//     return
//   }
//   console.log('删除目录成功')
// })

//  * 9. fs.unlink  删除文件
// fs.unlink('./aaa/index.html',err=>{
//   if (err){
//     console.log(err)
//     return
//   }
//   console.log('删除文件成功')
// })
  1. 案例
//判断服务器上面有没有upload目录,如果没有创建这个目录,如果有的话不做操作 (图片操作

const fs = require('fs')
var path = './upload'

fs.stat(path,(err,data) => {
  if (err){
    mkdir(path)
    return
  }
  if (data.isDirectory()){
     console.log('upload目录已经存在')
  }else{
    //删除原来的文件,创建目录
    fs.unlink(path,err => {
      if (!err){
        mkdir(path)
      } else{
        console.log('创建目录失败!')
      }
    })
  }
})

function mkdir(path) {
  fs.mkdir(path,err =>{
    if (err){
      console.log(err)
      return
    } 
    console.log('创建成功')
  })
}
//找出wwwroot中所有的文件以及文件夹,将其中的目录放在一个数组中

//使用递归和自执行完成

//nodejs中的很多方法 都是异步的

const fs = require('fs')
var path = './wwwroot'
var dirArr = []

fs.readdir(path,(err,data) => {
  if (err){
    console.log(err)
    return
  }
  (function getDir(i) {
    if(i == data.length){
      console.log(dirArr)
      return
    }
    fs.stat(path + '/' + data[i],(error,stats) =>{
      if (stats.isDirectory()){
        dirArr.push(data[i])
      }
      getDir(i+1)
    })
  })(0)
})

我们还可以使用async和await完成这个任务
async是让方法成为异步
await是等待异步完成,它只能在异步方法中使用
Promise是异步编程的一种解决方案,可用于返回异步数据

const fs = require('fs')
var path = './wwwroot'
async function isDir(path) {
  return new Promise((resolve, reject)=>{
    fs.stat(path,(err,data) =>{
      if (err){
        reject(err)
        return
      } 
      if (data.isDirectory){
        resolve(true)
      } else {
        resolve(false)
      }
    })
  })
}

function main() {
  var path = './wwwroot'
  var dirArr = []
  fs.readdir(path,async (err,dta) =>{
    if (err){
      console.log(err)
      return
    }
    for (var i = 0; i < dta.length; i++) {
      if(await isDir(path + '/' + dta[i])) {
        dirArr.push(dta[i])
      }
    }
    console.log(dirArr)
  })
}
main()

当然,我们完全可以使用同步的方法去写,这样免去了很多麻烦,但是异步的更不容易想出来,因为它执行的顺序在同步之后,希望大家理解这种写法

  1. 以流的方式读取和写入文件(适用于大文件的读写)
const fs = require('fs')

var readStream = fs.createReadStream('./data/input.txt')

var str = ""
var count = 0
readStream.on('data',data=>{
  str += data
  count++
})
readStream.on('end',()=>{
  console.log(str)
  console.log(count)
})
readStream.on('error',err=>{
  console.log(err)
})

读取流读取文件时是一点一点读取的,所以需要监听事件才能获取读取的数据

const fs = require('fs')

var str = '我是数据\n'.repeat(500)

var writeStream = fs.createWriteStream('./data/output.txt')

writeStream.write(str)

//标记文件末尾 不写这个则下面的监听finish事件没有作用
writeStream.end()

writeStream.on('finish',()=>{
  console.log('写入完成')
})

管道流(将读取的直接写入)

//管道流
const fs = require('fs')

var readStream = fs.createReadStream('./data/input.txt')
var writeStream = fs.createWriteStream('./test.txt')

readStream.pipe(writeStream)

好了,我的分享就到这里了,谢谢大家

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值