Node内置对象

1、全局对象无论是在Node程序中哪个地方,哪个时间都能够访问,主要有一下几个对象

  • process

process.env,可以通过process.env.xxx来获取系统中的环境变量值,可以通过根据不同的环境变量的值生成不同的配置,已达到不同的开发环境运行效果

具体用法:

// 在这里可以通过不同运行环境引入不同的配置,如端口号、文件编译压缩出口等等
let cif = proccess.env.development ?  ...require( config.production || config.development ) 复制代码

process.argv,获取命令行参数

//add文件,在这里,可以通过输入命令行,然后加两个数字做一个简单的加法
let num1 = parseInt(process.argv[2]);
let num2 = parseInt(process.argv[3]);
let sum = num1 + num2;
setTimeout(()=>{console.log(sum);
}.1000)//然后通过运行Node命令行,process.argv=>[node绝对路径,文件的绝对路径,参数1,参数2,...]
node ./add.js (文件路径) 1(第一个参数) 3(第二个参数)复制代码
  • filename/dirname

__filename,获取当前运行文件的绝对路径

__dirname,获取当前运行文件的目录的绝对路径

2、核心对象(需要向系统引入,不需要下载)

  • path

path.resolve(__dirname,xxx,xxx),将路径或路径片段的序列解析为绝对路径

path.join(__dirname,xxx,xxx),将字符串拼接起来解析成路径

path.join(__dirname), 将路径解析成一个对象

3、自定义对象
需要下载,按照路径引入

文件引入、导出

// 引入文件
const xxx = require('XXX')
// 导出文件
const xxx = 对象/函数
module.exports xxx复制代码

fs模块,文件读写操作

  1. fs.readFile(异步读取文件的全部内容)
const fs = require('fs');
let filepath = 'xxx'; //读取文件的路径
// 如果data是
fs.readFile(filepath,'utf-8',(error,data)=>{if(error)console.log(error)// 回调函数返回的是二进制数据Bufferconsole.log(data);// 需要输出字符串的话,可以通过toString()转换console.log(data.toString())
})复制代码

2. fs.wirteFile(异步将数据写入文件,如果文件已存在则覆盖改文件)

const fs = require('fs')
let filepath = 'xxx' //写入文件的路径
// data可以是一个字符串,也可以为buffer,若data为buffer,encoding(utf-8)则被忽略
fs.writeFile(filepath,data,'utf-8',(error)=>{if(error){console.log(error);}
})复制代码

3.fs.writeFileSync(同步写入文件)

fs.writeFileSync(file,data)复制代码

4.fs.readFileSync (同步读取文件)

fs.readFileSync(file,data)复制代码

相关补充点:

fs.access(测试用户对filepath指定的文件或目录的权限)

fs.state(获取文件的状态)

fs.readdir(读取文件目录)

fs.stats类

  • stats.isFile(判断是否为文件)
  • stats.isDireactor(判断是否为文件夹)
const fs = require('fs');
const path = require('path);
let filepath = 'xxx';
// 判断文件是否存在
method = fs.constants.F_OK;
/*
fs.constants.W_OK 文件是否可写
fs.constants.R_OK 文件是否可
*
function findFile(filepath){try{fs.access(filepath,method);console.log(${filepath} ${error? '不存在':'存在'});let state = fs.stateSync(filepath);if(state.isfile()){console.log(filepath);}else(state.isDireactory()){let files = fs.readdirSync(filepath);files.forEach(file => {findFile(path.join(filepath,file));});}catch(e){console.log(e);}
}复制代码

读写流——压缩、加密(fs.createReadStream、fs.createWriteStream、zlib)

const http = require('http');
const fs = require('fs');
const zlib = require('zlib');http.createServer((req,res)=>{let filePath = 'xxx'; // 读取文件的路径let rs = fs.createReadStream(filePath); //创建读取流rs.on('error',(error)=>{});res.setHeadr('content-encoding','gzip'); //发送响应头,告知浏览器返回的数据格式let gz = zlip.createGzip(); // 压缩rs.pipe(gz).pipe(res); // pipe管道,将上一步的结果作为输入,然后进行相应的处理
}).listen(8080);复制代码

http模块

// 创建一个server服务
const http = require('http');
let server = http.createServer((req,res)=>{// req 是浏览器请求的内容,有关请求的内容都可以从req里面获取// res 是服务器返回的响应res.write();res.end();
})
server.listen(8080);复制代码

原生Node常见解析GET提交的表单数据

const http = require('http');
const url = require('url');http.createServer((req,res)=>{    console.log(req.url); // 输出例子: /aaa?user=test&password=123,/aaa为地址,后面为数据    let {pathname,query} = url.parse(req.url,true);    console.log(pathname); // 输出 /aaa    console.log(query); //输出 {username: 'test', password: '123'},将GET请求方式的数据解析成一个对象
}).listen(8080);复制代码

原生Node常见解析POST提交普通表单数据

const http=require('http');
const querystring=require('querystring');let server=http.createServer(function (req, res){
let url = req.url;
console.log(req.url); // /aaa,因为是POST方式,所以地址不带有数据let arr=[];// 这里接收的data为十六进制数据req.on('data', buffer=>{arr.push(buffer);});req.on('end', ()=>{let buffer=Buffer.concat(arr);console.log(buffer.toString()); // user=test&password=123let post=querystring.parse(buffer.toString());console.log(post); // {user: 'test',password: '123}});
});
server.listen(8080);复制代码

querystring.parse(),将user=test&password=123这类数据格式转换成一个json对象

quertstring.stringify(),将json对象转换成user=test&password=123数据格式

multiparty解析上传文件

(需要将HTML中form表单提交方式为POST,enctype="multipart/formdata")

使用前先下载

npm i multiparty复制代码
const http=require('http');
const multiparty=require('multiparty');http.createServer((req, res)=>{let form=new multiparty.Form({uploadDir: './upload' //文件上传的路径});form.parse(req);// 解析普通form表单数据form.on('field', (name, value)=>{console.log('字段:', name, value); //user 123});// 解析上传文件的信息form.on('file', (name, file)=>{console.log('文件:', name, file);});form.on('close', ()=>{console.log('表单解析完成');});
}).listen(8080);复制代码

返回请求头

const http = require('http');
http.createServer((req,res)=>{res.setHeader('Content-Type','text/html');res.setHeader('x-Foo','bar');res.writeHead(200, {'Content-Type': 'text/plain'});// res.writeHead(200,{'Content-Type': 'text/html;charset=utf-8'});// res.writeHead(200,{'Content-Type': 'application/json'});res.end();
}).listen(8080);复制代码

获取请求头

const http = require('http');
http.createServer((req,res)=>{let header = req.headers; // 获取请求头let url = req.url; // 获取域名let method = req.method; //获取请求方式
}).listen(8080);复制代码

原生ajax跨域问题,因为SOP(同源策略机制),ajax向服务器发出请求时(不是直接向服务器发出请求),首先是向浏览器发起请求,然后浏览器再向服务器发出请求,服务器返回请求结果,然后浏览器接收到请求结果,判断请求的结果与ajax是否处于同一域名下,如果不是,则丢弃,反之,则将结果返回给ajax。要想原生ajax能成功跨域,则需要服务器做出声明。

<!DOCTYPE html>
<html lang="en" dir="ltr"><head><meta charset="utf-8"><title></title><script>window.onload=function (){let oBtn=document.getElementById('btn1');oBtn.onclick=function (){let ajax=new XMLHttpRequest();ajax.open('GET', 'http://localhost:8080/a', true);ajax.send();ajax.onreadystatechange=function (){if(ajax.readyState==4){if(ajax.status==200){alert('成功');let json=JSON.parse(ajax.responseText);console.log(json);}else{alert('失败');}}};};};</script></head><body><input type="button" value="请求" id="btn1"></body>
</html>复制代码
const http = require('http');
http.createServer((req,res)=>{let allOrigin = {'http://localhost': 'true','http://xxx.xxx': 'true','http://xxx/xxx': 'true'}// 获取域名let { origin } = req.headers;// 发送声明if(allOrigin[origin]){res.setHeader('access-control-allow-origin','*');}
}).listen(8080);复制代码

fetch请求方式

(原生,可以解析普通文本、JSON、二进制数据)

<!DOCTYPE html>
<html lang="en" dir="ltr"><head><meta charset="utf-8"><title></title><script>window.onload=function (){let oBtn=document.getElementById('btn1');let img1=document.getElementById('img1');// fetch是异步请求的方式,这里利用了ES6的async/await语法oBtn.onclick=async function (){//1.请求// let res=await fetch('data/1.txt'); //普通文本数据// let res = await fetch('data/1.json'); //json数据let res = await fetch('data/1.png'); // 二进制数据//2.解析数据,也是异步方式// let str= await res.text();// alert(str);// let json = await res.json();// console.log(json);let data = await res.blod(); //解析二进制数据let url = URL.createObjectURL(data); //在本地临时创建保存一个urlimg1.src = url;};};</script></head><body><input type="button" value="读取" id="btn1"><img id="img1" /></body>
</html>复制代码

FormData

FormDate(前端处理表单数据,然后交给ajax提交数据)、Ajax、multiparty(Node)配合使用

原生Ajax提交数据

<!DOCTYPE html>
<html lang="en" dir="ltr"><head><meta charset="utf-8"><title></title></head><body><form id="form1" action="http://localhost:8080/" method="post">用户:<input type="text" name="user" /><br>密码:<input type="password" name="pass" /><br>文件:<input type="file" name="f1" /><br><input type="submit" value="提交"></form></body><script>let oForm=document.querySelector('#form1');oForm.onsubmit=function (){let formdata=new FormData(oForm);let xhr=new XMLHttpRequest();xhr.open(oForm.method, oForm.action, true);xhr.send(formdata);xhr.onreadystatechange=function (){if(xhr.readyState==4){if(xhr.status==200){alert('成功');}else{alert('失败');}}};return false;};</script>
</html>复制代码
const http=require('http');
const multiparty=require('multiparty');http.createServer((req, res)=>{let form=new multiparty.Form({uploadDir: './upload' //文件上传的路径});form.parse(req);// 解析普通form表单数据form.on('field', (name, value)=>{console.log('字段:', name, value); //user 123});// 解析上传文件的信息form.on('file', (name, file)=>{console.log('文件:', name, file);});form.on('close', ()=>{console.log('表单解析完成');});
}).listen(8080);复制代码

JQuery-Ajax

<!DOCTYPE html>
<html lang="en" dir="ltr"><head><meta charset="utf-8"><title></title></head><body><form id="form1" action="http://localhost:8080/" method="post">用户:<input type="text" name="user" /><br>密码:<input type="password" name="pass" /><br>文件:<input type="file" name="f1" /><br><input type="submit" value="提交"></form></body><script src="jquery.js" charset="utf-8"></script><script>$('#form1').on('submit', function (){let formdata=new FormData(this);$.ajax({url: this.action,type: this.method,data: formdata,/* JQuery会自动将data中上传的数据转换成另外一种格式,所以会导致数据格式不正确,导致失败 */processData: false, // 不需要转换数据格式/* JQuery会自动提交一个contentType,导致失败 */contentType: false // 不需要篡改contentType}).then(res=>{alert('成功');}, res=>{alert('失败');});return false;});</script>
</html>复制代码

若无form表单,可自定义一个FormData(Ajax2.0),然后在FormData里添加内容

<!DOCTYPE html>
<html lang="en" dir="ltr"><head><meta charset="utf-8"><title></title></head><body><div id="div1">用户:<input type="text" id="user" /><br>密码:<input type="password" id="pass" /><br>文件:<input type="file" id="f1" /><br><input id="btn1" type="button" value="提交"></div></body><script>let oBtn=document.querySelector('#btn1');oBtn.onclick=function (){let formdata=new FormData();formdata.append('username', document.querySelector('#user').value);formdata.append('password', document.querySelector('#pass').value);formdata.append('f1', document.querySelector('#f1').files[0]);//let xhr=new XMLHttpRequest();xhr.open('post', 'http://localhost:8080/', true);xhr.send(formdata);xhr.onreadystatechange=function (){if(xhr.readyState==4){if(xhr.status==200){alert('成功');}else{alert('失败');}}};};</script>
</html>复制代码

Websocket(性能高、双向发送数据,天然加密)

原生Websocket创建连接:

<!DOCTYPE html>
<html lang="en" dir="ltr"><head><meta charset="utf-8"><title></title><script>// 创建scoketlet ws=new WebSocket('ws://localhost:8080/');// 建立连接ws.onopen=function (){alert('连接已建立');};// 数据交互ws.onmessage=function (){};// 连接关闭ws.onclose=function (){};// 连接发送错误ws.onerror=function (){};</script></head><body></body>
</html>
复制代码
const net=require('net');
const crypto=require('crypto');// 解析浏览器请求头(字符串),解析成JSON对象
function parseHeader(str){let arr=str.split('\r\n').filter(line=>line);arr.shift();let headers={};arr.forEach(line=>{let [name, value]=line.split(':');name=name.replace(/^\s+|\s+$/g, '').toLowerCase();value=value.replace(/^\s+|\s+$/g, '');headers[name]=value;});return headers;
}// 创建服务器
let server=net.createServer(sock=>{sock.once('data', buffer=>{// 首次接收请求头可转换成字符串let str=buffer.toString();let headers=parseHeader(str);// 判断浏览器发来的请求头中协议是否升级为websocketif(headers['upgrade']!='websocket'){console.log('no upgrade');sock.end();}else if(headers['sec-websocket-version']!='13'){ //判断websocket版本console.log('no 13');sock.end();}else{// 获取keylet key=headers['sec-websocket-key'];// websocket固定的验证方式let uuid='258EAFA5-E914-47DA-95CA-C5AB0DC85B11';let hash=crypto.createHash('sha1');hash.update(key+uuid);let key2=hash.digest('base64');// 发送返回头报文sock.write(`HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection:upgrade\r\nSec-Websocket-Accept:${key2}\r\n\r\n`);}});sock.on('end', ()=>{});
});
server.listen(8080);复制代码

socket.io

(简单方便,自动解析,兼容IE5,自带跨域)

前端用法:

<!DOCTYPE html>
<html lang="en" dir="ltr"><head><meta charset="utf-8"><title></title>// 服务器自动返回socket.io<script src="http://localhost:8080/socket.io/socket.io.js" charset="utf-8"></script><script>// 连接scoket.iolet sock=io.connect('ws://localhost:8080/');// 发送数据 sock.emit(函数名字,数据值1,数据值2)//sock.emit('aaa', 12, 5);// 接收数据 sock.in(函数名字,(参数1,参数2)=>{})sock.on('timer', time=>{console.log(time);});</script></head><body></body>
</html>复制代码

服务器:

npm i socket.io复制代码
const http=require('http');
const io=require('socket.io');//1.建立普通http
let server=http.createServer((req, res)=>{});
server.listen(8080);//2.建立ws
let wsServer=io.listen(server);
wsServer.on('connection', sock=>{//sock.emit('name', 数据)//sock.on('name', function (数据){});/*sock.on('aaa', function (a, b){console.log(a, b, a+b);});*/setInterval(function (){sock.emit('timer', new Date().getTime());}, 1000);});
复制代码

转载于:https://juejin.im/post/5cbe5108e51d456e5977b19e

Node基础篇(一)相关推荐

  1. Node.js Stream - 基础篇

    背景 在构建较复杂的系统时,通常将其拆解为功能独立的若干部分.这些部分的接口遵循一定的规范,通过某种方式相连,以共同完成较复杂的任务.譬如,shell通过管道|连接各部分,其输入输出的规范是文本流. ...

  2. 面试官问你关于node的那些事(基础篇)

    ❝ 前沿:文章的起源,是树酱的朋友在最近面试中对部分岗位中对node掌握程度要求感到很"慌 ",当然node已渐渐从很多公司招聘的"加分项"转变为"强 ...

  3. Node.js后端开发 - 基础篇 #18 nodemon工具

    文章目录 前言 nodemon工具简单介绍 nodemon工具安装 nodemon工具使用(node app.nodemon app) nodemon工具使用(npm run start) 前言 上篇 ...

  4. 你所需要的java基础篇和提升篇大总结

    好好学java 致力于java知识分享 关注 精彩内容 你所需要的java全套视频教程 你所需要的java电子图书 你所需要的大数据视频教程 你所需要的java练习项目 如 / 诗 近半个月,每天一篇 ...

  5. C++面试八股文快问快答の基础篇

    文章目录 基础篇 变量的声明和定义有什么区别 简述#ifdef.#else.#endif和#ifndef的作用 写出int .bool. float .指针变量与 "零值"比较的i ...

  6. 手摸手,带你用vue撸后台 系列一(基础篇) - 掘金

    完整项目地址:vue-element-admin 系列文章: 手摸手,带你用 vue 撸后台 系列一(基础篇) 手摸手,带你用 vue 撸后台 系列二(登录权限篇) 手摸手,带你用 vue 撸后台 系 ...

  7. Nginx实战基础篇一 源码包编译安装部署web服务器

    Nginx实战基础篇一 源码包编译安装部署web服务器 版权声明: 本文遵循"署名非商业性使用相同方式共享 2.5 中国大陆"协议 您可以自由复制.发行.展览.表演.放映.广播或通 ...

  8. 菜鸟学习笔记:Java基础篇4(面向对象三大特征)

    菜鸟学习笔记:Java面向对象篇中 继承 概念 方法重写(override) Object类 Super关键字 组合 final关键字补充 封装 访问控制符 多态 继承 概念 继续上一篇的例子: #m ...

  9. 菜鸟学习笔记:Java基础篇3(面向对象思想、程序执行过程内存分析、面向对象重要概念)

    菜鸟学习笔记:Java面向对象篇上 Java面向对象的思想 Java程序执行过程内存分析 Java垃圾回收机制 构造方法 方法重载(overload) static关键字 this关键字 Java面向 ...

最新文章

  1. JavaScript中的HTTP GET请求?
  2. JQuery DOM基本操作
  3. windbg调试相关命令
  4. 4thweek.P_problemB .poj1505copy books.二分法
  5. 10张图,让你瞬间给自己减压
  6. 在Angular中添加第三方库jQuery、bootstrap
  7. solr5.3.1 mysql_Solr-5.3.1 dataimport 导入mysql数据
  8. win10如何添加linux开机引导,win10 linux 双系统怎么设置开机引导
  9. 企业CIS 系统的收集方法分析
  10. 模似html元素tilte提示
  11. NMDS非度量多维尺度分析
  12. 无痕HOOK方式=硬断+VEH
  13. 数据分析师 知识体系 业务篇
  14. 关于真空荧光显示屏的·学习记录
  15. 统计学 一元线性回归
  16. 伪类、伪元素及五星好评css实现
  17. radisys官方介绍--Promentum ATCA-1200== ATCA 可控 4-AMC 刀片式载板
  18. backtrader量化回测,基础篇,附MACD交易回测代码
  19. 目前SEP 离线升级包下载及升级方法
  20. 保姆级教程教你快速搭建属于自己的AI绘画系统!(收藏)

热门文章

  1. HTML5 标签、事件句柄属性以及浏览器兼容情况速查手册
  2. netapp学习(五)---创建volume
  3. ajaxfileupload带参数上传文件
  4. 小小树微博制作记录笔记(一)
  5. Android_高清加载巨图方案 拒绝压缩图片
  6. 解决remove @override annotation
  7. 字典树(Trie树)
  8. VBS中MSGBOX用法
  9. docker-compose部署常用服务
  10. Appirater -- app中提示用户为app评价的提示框