前言
本次学习资源来源于B站:https://www.bilibili.com/video/av38925557?p=1
学习工程文件百度网盘:https://pan.baidu.com/s/11GO6Pnuo8dKzgY0JikdZLw
提取码:tm14
工具:node.js稳定版12.16.1 :https://nodejs.org/zh-cn/
1.http模块-建立web服务器
文件路径:demo02
//定义常量引用,防止修改
const http = require("http");
//req 获取url后所带参数 如http://127.0.0.1:3000/aaa req中
//res 给浏览器响应信息
http.createServer(function(req,res){
console.log(req.url);
// 设置响应头 状态码是200 文件类型是html 字符集是utf-8
res.writeHead(200,{"Content-type":"text/html;charset='utf-8'"});
//设置html里字符集 注意多层双引号的使用
res.write(" ");
// 写入信息
res.write('你好 node.js');
//结束响应
res.end('0');
}).listen(3000);//端口号多为3000以上 http://127.0.0.1:3000/
2.url模块-解析地址
文件路径:demo02
常用于获取地址后所带参数
const url = require("url");
var data01 = "http://www.baidu.com?name=张三&age=20";
//parse为解析方法 data01是网址,true是将解析的参数变为对象 方便调用
console.log(url.parse(data01,true).query.name);
true的作用 : name=张三&age=20 —> { name: ‘张三’, age: ‘20’ }
3.supervisor 模块安装
文件路径:demo02
1.安装node.js后 有npm
2.打开cmd npm install -g cnpm --registry=https://registry.npm.taobao.org 下载cnpm
3.继续cmd cnpm install -g supervisor
4.重启
作用:每次保存后重启supervisor执行的应用
4.暴露方法及引用
文件路径:demo03
var bar={
get:function(){
console.log("得到");
},
post:function(){
console.log("上传");
}
}
module.exports=bar; //暴露整个对象
exports.add=function(){
console.log("add");
},
exports.del=function(){
console.log("del");
}
//单个暴露
引用
// var request = require("./node_modules/request.js");和下行引用等同
var request = require("request");
//在单层文件夹中,一般可以直接写 js文件名作为引用
/*在多层文件夹中,require会索引最里层文件夹的index.js
若使用cmd在最里层文件夹下 使用 npm init --yes 生产 package.json 则可以就可以使用了
*/
request.get();
var tools = require("tools/tools");
tools.add();
5.md5 字段加密模块
文件路径:demo04
/* 字段加密 md5
1.www.npmjs.com中找到包
2.在文件目录下打开cmd 下载 npm install md5 --save
save是往package.json中写入md5依赖
3.引用
4.npm install [email protected] --save 指定版本安装
*/
const md5 = require("md5");
console.log(md5("123456"));
6.silly-datetime 日期格式化模块
文件路径:demo04
/* 日期格式化
1.在网站上下载到本目录下 npm i silly-datetime --save
2.引用
*/
const sd = require("silly-datetime");
console.log(sd.format(new Date(),"YYYY-MM-DD HH:mm"));
7.package.json 模块描述文件
文件路径:demo04
在文件目录下 npm init --yes 生成,
{
"name": "demo04",
"version": "1.0.0",
"description": "",
"main": "index.js", //
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": { //文件依赖 若代码缺失 则使用npm i 来进行下载
"md5": "^2.2.1", //^表示第一位保持不变 后两位取最新 *表示前两位不变,后两位取最新
"silly-datetime": "^0.1.2"
}
}
8.fs 文件操作
文件路径:demo05及demo008
var fs = require('fs');
//1.fs.stat 检测目标是否是文件或者目录
fs.stat('./package.json',(err,data)=>{
if(err){
console.log("路径错误");
return;
}
else{
console.log('目标是文件:'+data.isFile());
console.log('目标是目录'+data.isDirectory());
return;
}
});
//2.fs.mkdir 创建文件
fs.mkdir('./map',(err)=>{
if(err){
console.log('创建失败或文件已存在');
return;
}else{
console.log('创建成功');
return;
}
});
//3.fs.writeFile 创建写入文件 已存在就覆盖
fs.writeFile('./html/index.html','hello world!',(err)=>{
if(err){
console.log('创建或覆盖失败');
return;
}else
{
console.log('创建或覆盖成功!');
return;
}
});
//4.fs.appendFile 追加写入文件
fs.appendFile('./html/index.css','body{color:red}\n',(err)=>{
if(err){
console.log('写入文件失败');
return;
}else
{
console.log('appendFile seccuss');
return;
}
});
//5.fs.readFlie 读取文件(内)信息 data为buffer类型数据(16进制)
fs.readFile('./html/index.html',(err,data)=>{
if(err){
console.log('读取失败');
return;
}else
{
console.log('读取成功\n');
console.log(data.toString());
return;
}
});
//6.fs.readdir 读取目录或文件(非文件内信息)
fs.readdir('./html',(err,data)=>{
if(err){
console.log('读取失败');
return;
}else
{
console.log('读取成功');
console.log(data);
}
});
//7.fs.rename 重命名或移动文件
fs.rename('./html/index.html','./html/app.html',(err)=>{
if(err){
console.log('重命名或移动失败');
return;
}
console.log('seccuss');
});
//8. fs.unlink 删除文件
fs.unlink('./map/name.js',(err)=>{
if(err){
console.log('fail');
return;
}
console.log('seccuss');
});
//9.fs.rmdir 删除目录
fs.rmdir('./map',(err)=>{
if(err){
console.log('fail');
return;
}
console.log('seccuss');
});
//10.fs.readStream 读取文件流
const fs = require('fs');
var name= '';
//建立读取文件流
var readstream = fs.createReadStream('./data/name.txt');
//监听文件流数据
readstream.on('data',(data)=>{
name += data;
// console.log(name);
});
//监听文件流结束
readstream.on('end',()=>{
console.log(name);
});
//监听文件流错误
readstream.on('error',()=>{
console.log(error);
});
//11.fs.writeStream写入文件流
const fs = require('fs');
var num = '';
for(var i = 0;i<500;i++){
num += '今天天气很好\n';
}
//建立写入流
var writestream = fs.createWriteStream('./data/output.txt');
writestream.write(num);
//监听写入流
writestream.end(); //一定要有
writestream.on('finish',()=>{
console.log('文件写入成功');
});
//
//12.文件流通道
const fs = require('fs');
//将readstream读取的文件写入到writestream的地址
var readstream = fs.createReadStream('./data/name.txt');
var writestream = fs.createWriteStream('./dd/time.txt');
//管道流复制文件
readstream.pipe(writestream);
9.mkdirp 创建多层目录模块
文件路径:demo06
//在npmjs官网下载安装
const mkdirp = require('mkdirp');
mkdirp('./upload/demo02');
10.练习题(1)
文件路径:demo06
判断服务器上有没有upload目录。如果没有就创建 如果有不作操作
//判断服务器上有没有upload目录。如果没有就创建 如果有不作操作
const fs = require('fs');
var path = './upload';
fs.stat(path,(err,data)=>{
if(err){
//文件不存在
console.log('不存在目录,正在创建...');
mkdir(path);
return;
}
//文件存在
if(data.isDirectory()){
//文件存在且为目录
console.log('存在目录');
}else //文件存在且不为目录
{
fs.unlink(path,(err)=>{
if(err){
console.log('删除同名文件失败');
return;
}
console.log('删除同名文件');
mkdir(path);
});
}
});
function mkdir(dir){
fs.mkdir(dir,(err)=>{
if(err){
console.log('创建失败');
return;
}
console.log('创建成功');
});
}
11.练习题(2)
文件路径:demo06
wwwroot文件夹下面有image css js 以及index.html 找出wwwroot目录下所有目录,然后放到一个数组中
方式一:
//2.wwwroot文件夹下面有image css js 以及index.html 找出wwwroot目录下所有目录,然后放到一个数组中
//fs为异步 无法用for循环来限制 用递归来代替
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,nr)=>{
if(error){
console.log(error);
return;
}
if(nr.isDirectory()){
dirArr.push(data[i]);
// console.log(dirArr);
}
getDir(i+1);
})
})(0);
});
方式二:
//2.wwwroot文件夹下面有image css js 以及index.html 找出wwwroot目录下所有目录,然后放到一个数组中
const fs = require('fs');
var dirArr = [];
const path = './wwwroot';
async function main(){
//获取当前目录下的所有子目录及文件
var nowdir = await Read(path);
//console.log(nowdir); //[ 'css', 'image', 'index.html', 'js' ]
//判断文件是否为目录
for(var i = 0;i<nowdir.length;i++){
//检查每个文件是否是文件夹
if(await Check(nowdir[i])){
dirArr.push(nowdir[i]);
}
}
console.log(dirArr);
}
main();
//读取目录 返回子目录
async function Read(path){
return new Promise((resolve,reject)=>{
fs.readdir(path,(err,data)=>{
//读取目录失败
if(err){
console.log('打开目录失败');
return;
}
//读取目录成功
resolve(data);
});
});
}
//检测是否为文件 返回true false
async function Check(data){
return new Promise((resolve,reject)=>{
var nowPath = path+'/'+data;
console.log('1111'+nowPath);
fs.stat(nowPath,(error,checkdata)=>{
//检测失败
if(error){
console.log("检测"+nowPath+"文件失败");
reject(error);
return;
}
//检测成功
if(checkdata.isDirectory()){
resolve(true);
}else{
resolve(false);
}
});
});
}
12.Promise 用法
//回调方式 外部获取异步方法里面的数据
function getData(callbck){
setTimeout(()=>{
var name = '张三';
callbck(name);
},1000);
}
getData((aaa)=>{
console.log(aaa);
});
//promise的用法一 resolve成功的回调函数 reject失败的回调函数
var p = new Promise(function(resolve,reject){
setTimeout(()=>{
var name = '张三';
resolve(name);
},1000);
});
p.then(function(data){
console.log(data);
})
//promise用法二
function getData(resolve,reject){
setTimeout(()=>{
var name = '张三';
resolve(name);
},1000);
}
var p = new Promise(getData);
p.then(function(aaa){
console.log(aaa);
});
13.async 声明异步方法,await 等待异步方法完成
文件路径:demo08
//async 声明异步方法返回一个promise await 等待异步方法完成且只能用在异步方法中
// async 取异步方法中的值
async function add(){
var name = 'liu';
return name;
}
// console.log(add());
//输出 Promise { 'liu' }
async function main(){
var dd= await add();
console.log(dd);
}
main();
//用async 封装一个异步方法 并可以从外部调用 取异步方法中的值
async function test(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
var name = '1111';
resolve(name);
},1000);
});
}
async function main(){
var dd = await test(); //await必须放在async方法中
console.log(dd);
}
main();
14.非阻塞式IO
文件路径:demo10
//非阻塞式io
const fs = require('fs');
function getdata(){ //异步方法
console.log('1');
fs.readFile('./mime.json',(err,data)=>{
console.log('2');
});
console.log('3');
} //打印 1 3 2
getdata();
15.回调函数(处理异步)
文件路径:demo10
const fs = require('fs');
function test1(callback){
fs.readFile('mime.json',(err,data)=>{
callback(data.toString()); //
});
}
test1((res)=>{
console.log(res);
});
16.events.EventEmitter 广播与监听(处理异步)
文件路径:demo10
当使用events.EventEmitter时
http模块中
res.write(data);
res.end();
会报错
改为:
//res.write();
res.end(data);
//引入events模块 实例化EventEmitter类来绑定和监听事件
const events =require('events');
var EventEmitter=new events.EventEmitter(); //实例化
//广播
setTimeout(function(){
console.log('开始广播...');
EventEmitter.emit('function_name','发送的数据'); //不用定时器就监听不到
},2000);
//监听广播
EventEmitter.on('function_name',()=>{
console.log('接收到广播了');
});