什么是:不是JS,是一种软件开发平台,它的竞争对象JSP/PHP/ASP.NET,历史第一次有一种语言可以通吃前后端.
Node运行的两种方式:
1.交互模块---简单了解(测试新功能)
REPL:输入一行代码执行一行
注意:交互模自带输出功能,不必一定要 console.log()
node 回车 进入交互模式
.exit 退出
2.脚本模块—正式项目中使用
把要执行所有语句编写一个文本文件中(后缀任意,没有),一次性提交node解析器执行.
node 完整路径/x.js 回车
提交:只要安装成node.js,重启webstorm,ws可以自动发现node.exe解析,新的项目和文件编写一定UTF-8
建议:所有目录名称,不要有中文,不要有空格
数据类型:(nodejs vs js)
nodejs | js |
(1) 基本/原生/值类型 string/number/boolean/null/undefined (2)引用类型 ES对象类型:Error/Data/Math/Array/RegExp/Object/.... 用户自定义对象类型:{} Node.JS 第三方对象:十万多 https://www.npmjs.com/ |
(1)基本/原生/值类型 string/number/boolean/null/undefined (2)引用类型 ES对象类:Error/Data/Math/Array/RegExp/Object/.... BOM:window;docuemnt,location,event,screen,.... DOM:Element,Attribute,..... 用户自定义对象类型:{} |
模块概念:
一个项目中多个”模块”,订单模块,用户模块,支付模块....
node.js按照功能,可以把函数,对象分别保存不同文件或目录下,这些目录和文件在node.js称为一个“模块”
##注意:Node.JS每个一个模块都是一个独立构造函数,
Node.JS解析器自动为每一个.js文件添加如下代码.
(function(exports,require,module,__filename,__dirname){
exports:{} 用于声明向外部导出自己成员
require:fn 用于导入其它的模块,并且创建指定模块对象
module: 当前模块对象
__filename
__dirname
var i = 10;
var j = 11;
console.log(i+j);
});
每个模块都可以使用自己require();引入另一个模块—底层本质是创建指定模块一个对象实例.
自定义模块的两种形式:
(1)文件模块
创建一个JS文件,如m3.js,导出其公开数据,
其它模块可以require("./m3");引入
(2)目录模块
方式一:创建一个目录,假设m4,其中创建index.js文件,导
出需要公开数据。其它模块引入
var m = require(“./m4”);
方式二:创建一个目录,假设m5,其中创建5.js文件,导出需要
公开数据数据,创建package.json文件 main指定启动
文件 5.js 其它模块引入
var m = require(“./m5”);
方式三:创建一个目录,必须名为 node_modules
,其中再创建目录模块,假设 m6 其中创建 package.json
文件,其中声明 main属性指定默认执行启动js,如6.js,
其中导出需要公共数据,其它模块引入
require(“m6”);
原生模块的使用(解析引擎自带)
1.Buffer(缓冲区)
Buffer:缓冲区,本质上是一块内存区域,用于暂存以后要用到数据
(数字,字符串,二进制图片/音频/视频),该区域称为“缓存”
#分配置一个指定大小缓冲区 1024字节
建议:缓冲区大小不超过 512KB 512*1024
var buff1 = Buffer.alloc(1024);
#使用一个数组创建缓冲区
var buff2 = Buffer.from([1,2,3]);
#使用一个字符串创建缓冲区
var buff4 = Buffer.from(“abc”);
#将一个缓冲区内容转换字符串{如果缓冲区数据是字符串}
var str = buff4.toString();
2.QueryString
querystring模块用于处理HTTP请求URL中查询字符串
var obj = qs.parse(str); 把查询字符串解析js对象
var str = qs.stringify(obj) 把js对象转换为查询字符串
3.URL
url模块用于解析一个HTTP请求地址,获取其中各个部分
var obj = url.parse(str); 把一个URL地址为js对象
var obj = url.parse(str,true); 功能同上,并且把其中查询字符串转换
4.fs
文件:在node.js 我们系统文件或者目录统称为文件
fs 模块提供对文件和目录进行,增删改查,读定文件内容
1.同步读写文件(阻塞)
#同步读取文件内容 var data = fs.readFileSync(fileName);
#同步向文件写内容 fs.writeFileSync(fileName,data);
注意:(1)如果当前写入文件并不存在,自动创建一个
a.txt
(2)如果当前写入目录并不存在,报错
d:/abc/a.txt
(3)如果当前文件己经存在内容,清空
#同步向文件追加内容
fs.appendFileSync(fileName,data);
2.异步读写文件(非阻塞)
#异步读取数据 fs.readFile(fileName,function(err,data){ });
函数:文件读取完成后调用
err:读取文件不存在,权限不足,
自动创建错误对象
#异步写数据 fs.writeFile(fileName,data,function(err){})
函数:文件写结束调用
#异步追加数据 fs.appendFile(fileName,data,function(err){})
函数:文件追加结束
5.http
HTTP 模块可用于编写基于HTTP协议客户端程序(即浏览器),也可以编写一个基于HTTP协议服务器(APACHE)
用http模块编写一个web服务器
(1)创建服务器对象 var server = http.createServer();
(2)绑定监听端口 1-65535 server.listen(3000);
(3)接收客户端请求, server.on(“request”,(req,res)=>{..})
(4)并且响应客户消息 res.end(str...);
req:请求对象:保存客户端请求消息
req.url 请求url地址
res:响应对象:服务器发送数据客户端,修改响应格式
三个常用对象:
1.server 代表服务器对象
2.req (request)请求对象,保存客户端很多信息
req.url 客户请求地址
req.method 客户请求方式
req.httpVersion HTTP版本
req.headers 请求头
3.res (response)响应对象,保存服务器端向客户发送数据
res.statusCode = 200;
res.setHeader(); 设置响应头
res.write(); 向客户端输入响应消息主体
res.end(); 通知客户端,响应消息结束(只能一次)
常见错误:程序端口被占用
listen EADDRINUSE :::3000
解决:查找前面程序停止即可
6.第三方模块 (mysql/express)
mysql模块:
SQL语句的分类
DDL:数据定义语句 CREATE/DROP/ALTER…
DCL:数据控制语句 GRANT…
DML:操作操作语句 INSERT/UPDATE/DELETE
DQL:查询语句 SELECT
使用node.js访问mysql服务器:使用工具 npm 下载第三方模块(npm i mysql)
mysql模块使用步骤:
(1)下载模块
(2)加载mysql模块 const mysql = require(“mysql”);
(3)创建到数据库服务器连接 var conn = mysql.createConnection({})
(4)发送sql语句并且获取服务器返回结果 conn.query(sql,(err,result)=>{});
(5)关闭连接 conn.end();
express模块:
使用官方提供HTTP模块可以创建一个web服务器应用,但此模块非常底层,要处理各种情形,比较繁琐。推荐使用HTTP高层模 块,express—第三方模块,是一个基于node.js http模块的高层模块,简化服务器端开发。
使用步骤:
- 下载模块 npm i express
- 加载相应模块 http/express
- 创建express对象,再创建服务器对象,并且绑定监听端口
var app = express();
var server = http.createServer(app);
server.listen(3000)
常规语法规则:
app.get(请求地址,回调函数);
#接收客户请求 GET /index.html
app.get(“/index.html”,(req,res)=>{});
#接收客户请求 POST /index.html
app.post(“/index.html”,(req,res)=>{});
1:express req和res对象
res.sendFile(__dirname+文件绝对路径); =fs.read+res.write+res.end
res.send(向客户端返回html字符串响应);
res.json(obj); =setHead()+JSON.parse()+res.write()+res.end()
2:express GET 请求 接收参数二种方法
#GET /login.do?uid=10&uname=tom
app.get(“/login.do”,(req,res)=>{
//express为每一个req对象添加属性query
req.query.uid;
req.query.uname;
});
#GET /login.do/12/tom
app.get(“/login.do/:uid/:uname”,(req,res)=>{
//express 为每个req对象添加一个params 属性
req.params.uid
req.params.uname
});
3:为了项目提高效率à创建连接池
(1)创建连接池
var pool = mysql.createPool({…}); host;user;password;
connectionLimit:5 连接池中活动连接5个
建议范围:5~25
(2)所有应用程序 租连接
pool.getConnection((err,conn)=>{ });
(3)归还连接 conn.release();
4:请求方式:HTTP协议
请求方法:用于标识此次请求的目的
GET 表示客户端想”获得”指定资源
POST 表示客户端想”上传/添加”指定数据给服务器,请求数据在请求主体中
PUT 表示客户端想”放置”数据在服务器
DELETE 表示客户端想”删除”服务器上指定资源
5:发送请求
浏览器发送GET请求
地址栏输入url回车/表单GET/AJAX GET/超链接/js跳转/img src
浏览器发送POST请求
表单POST/AJAX POST
浏览器发送DELETE请求
AJAX-DELETE
浏览器发送PUT请求
AJAX-PUT