nodej是一个JavaScript运行环境(runtime)。它让JavaScript可以开发后端程序,它几乎能实现其它后端语言能实现的所有功能,nodejs最擅长处理高并发
我没有对各个模块进行相应的描述,而是直接使用代码,让你快速上手
HTTP、URL模块
- 创建一个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/")
- 解析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
-
模块的分类
核心模块(内置模块): nodejs提供的模块,如http,url,path
文件模块(自定义模块):用户自己编写的 -
commonjs模块化标准
我们可以把公共的功能抽离成一个单独的js文件作为一个模块,默认这个模块中的属性和方法是私有的,但可以通过exports和module.exports向外暴露
有需要的时候模块之间可以通过require引入
单独的一个函数一般使用exports暴露,module.exports一般用来暴露对象 -
在引入模块时,默认会寻找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
- 包含有模块的就是包
- npm 是包管理工具,可以通过它往一个项目中添加或者删除包
- 别人写好的模块放到网上供我们随意使用的就是第三方模块,可以在npmjs官网寻找
- cnpm是淘宝镜像,在国内,下包速度更快
- 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. 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('删除文件成功')
// })
- 案例
//判断服务器上面有没有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()
当然,我们完全可以使用同步的方法去写,这样免去了很多麻烦,但是异步的更不容易想出来,因为它执行的顺序在同步之后,希望大家理解这种写法
- 以流的方式读取和写入文件(适用于大文件的读写)
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)
好了,我的分享就到这里了,谢谢大家