今天学习的内容
1:复习昨天重点
2:大鱼喂小鱼;首页
大鱼喂小鱼:
大鱼碰撞小鱼,小鱼吃饱,小鱼身体图片下标 = 0
碰撞检测: collsion.js 大鱼碰撞食物;
3:今天的目标
3.1:nodejs 模块
遇到问题:nodejs 作者nodejs 不足
(1)生活示例:实用主义;完美主义
(2)招聘条件:50% >公司(技术型,互联网公司)
3.2:下载配置
https://npm.taobao.org/mirrors/node
node-v9.9.0-x64.msi 64位windows版本
node-v9.9.0-x86.msi 32位windows版本
node-v9.9.0.pkg mac
3.3:阿里面试题:用户在在浏览器输入 www.taobao.com直到
看到网页发生了什么?
(1)操作系访问网络的DNS服务器,把域名转ip地址
(2)浏览器使用IP地址向淘宝发请求
(3)淘宝服务器接收请求,并解析请求内容,查询找资源,
可能数据库,构建并返回HTTP响应消息
(4)浏览器接收并解析响应消息
(5)浏览器缓存接收响应内容,并解析和渲染内容
3.4:静态网页和动态网页
静态:网页内容任何人任何时间访问都是不变的..
HTML/CSS/JS/Flash/视频音频
动态:网页内容不同人在不同时间访问可能是不同的..
DB/JSP/PHP/ASP/Node.JS
JSP=html+java 功能强大可靠,适合大型企业项目(阿里;银行)
2003-2004 淘宝[php+mysql];->mysql(oracle)->php->java->服务器
->小型机->oracle->{服务器+java+OC(mysql)}--卡车
PHP=html+php 简单易用:适合互联网项目(论坛) --家用轿
https://cn.wordpress.org/
ASP.NET=html+c# 易用;贵点
Node.js=html+js 性能好--(跑车)
node.js适合项目(io密集型) node.js 不适合项目(cpu密集型)
输入输出[查询;添加] 滴滴打车;天气预报...
3.5:Node.JS
Node.js不是js,是一种运行在服务器端开发平台(开发语言用js),
历史上第一次有一种语言可以通吃前后台.
https://npm.taobao.org/mirrors/node 淘宝镜像
3.6:Node.JS 运行模式
(1)交互模式---一般测试
输入一行代码执行一行
在命令行状态下输入
node 回车
退出 ctrl+c 二次
(2)脚本模式--正式项目中使用方式
把要执行的所有语句编写在一个文本文件中(后缀名任意,没有也行),一次性提交node解析器执行
node x.js 回车
解释器: C:\Program Files\nodejs\node.exe
练习:02_node.js 打印出九九乘法表,
以脚本模式在ws运行
3.7:Node.JS 如何自学一门新语言--Node.js
(1)了解背景
--百度百科 Node.JS [事件驱动,非阻塞I/O 模型]
(2)搭建开发环境,编写Hello World
(3)数据类型
前端js数据类型
1:原始[基本] number;string;boolean;null;undefined
2:引用/对象类型
ES对象:Math;Date;RegExp;Object;Function;Error.....
BOM/DOM对象:window;docuemnt;screen;event...
自定义:{}
后端Node.js 数据类型
1:原始[基本] number;string;boolean;null;undefined
2:引用/对象类型
ES对象:Math;Date;RegExp;Object;Function;Error.....
自定义:{}
(4)变量和常量
node js 提供了10几万·个专用对象
运算符:逻辑运算· 算术运算 三目运算 位运算 副职运算 typeof instanceof
逻辑结构:循环结构 while do while for for() 选择结构 if else switch case
声明一个保存五个学生的数学;
7.通用小程序
nodejs 模块
modal模态框
model模型
module模块 是nodejs特有 是一个web项目中的功能分为不同的模块
每一个模块都是一个独立的构造函数 解释器都会自动为js文件添加如下代码
(function(exports,require,module,__filename,__dirname){
expoirt{}用于声明向外部导出自己的成员 使用exports对象 对外导出或者公开自己的内部成员供其他成员使用
require:fn用于导入其他模块 并且创建制定模块对象 创建一个模块的实力 模块名称就是模块的文件名
module:只带当前模块对象
你写的代码
})
导出
const PI=Math.PI;
function getSize(r){
var size=2*PI*r;
return size;
}
function getPerimeter(r){
var p=PI*r*r;
return p;
}
//exports.PI=PI;
exports.getSize=getSize;
exports.Perimeter=getPerimeter;
导入
var m=require("./circle");
var c=m.getSize(2);
console.log(c);
var d=m.Perimeter(3);
console.log(d);
module指代当前对象
exports和modeule.exports
二者都可以用于指向外界导出自己的内部成员
真正导出数据modelu.export
node.js底层代码 exports=module.exports
如果导出一个完整的对象只能是m e 只导出属性 函数或变量 对象只能用me导出
最好都用 module.exports
编写数组模块
sum(),
module.exports.sum=sum;
module.exports.avg=avg;
var m=require("./arr");
!!!!!./必须要写 ./
exports不能导出对象
3.8 nodejs 模块的分类
三种:1.官方提供 require(“模块名称”)
2.第三方模块;
3.用户自定义的模块 nodule.exports require()
3.9
day02
通过nodejs搭建服务器
1. 引入nodejs核心模块 http
2. const http=require(“http”);
3. 创建一个服务器实例
4. let sever=http.createSever((req,res)=>{res.end(“it works.”);});
nodejs的全局模块 global 她的使用不需要引入
dirname 当前文件所在目录的绝对路径
全局对象console
全局对象 process thread 线程执行的最小单位
process.kill()结束某一个软件的运行
今天学习的内容
1:复习昨天的内容
2:首页
3:今天的目标
3.1:node.js 模块分类(自定义模块)
(1)官方提供模块
(2)第三方模块,单独下载 www.npmjs.com
(3)自定义模块
#文件模块: 创建一个js文件,如 m3.js 导出需要公开数据
其它模块 require("./m3");模块
#目录模块:
方式一:创建一个目录,假设名为 m4,其中创建名为index.js
文件,导出需要公开的数据,其它模块引用
require("./m4");
方式二:创建一个目录,假设名为 m5,其中创建名为 5.js
创建package.json main指定启动文件 5.js
方式三:创建一个目录,必须名为 node_modules,
其中再创建一个目录,假设 m6 ,其中创建
package.json描述文件,其中声明main属性
指定默认执行js文件,如 6.js ,其中导出需要
公共数据,其它模块require("m6");
练习:使用第三种方式,创建二个目录模块circle;rectangle
都对外公开两个方法
size() 返回指定图形面积
perimeter();返回指定图形周长
最后在最外层模块,引入上述两个模块
circle.size(r) circle.perimeter(r)
r.size(w,h); r.perimeter(w,h);
常见错误:
1: Error: Cannot find module './m4' 目录结构错误
3.2:node.js --- 特性(事件驱动; 非阻塞IO)
php 阻塞 IO {有顺序;效率差}
nodejs 非阻塞IO{无序;效率高}
3.3:node.js npm (Node Package Mangaer)
node.js的第三方模块/包管理器,可以用于下载;更新;删除;
维护包依赖关系的工具
npm 工具默认www.npmjs.com网站下载所需的第三方模块
包
使用npm工具下载一个新的软件包
npm install 包名 下载
npm uninstall 包名 删除
示例:
nodejs 下载nodejs mysql驱动程序(第三方模块)
1:查找 mysql 模块 www.npmjs.com [mysql]
2:npm install mysql
淘宝:开发工具 cnpm
cnpm install mysql [99.99%]
3.3:node.js 官方模块
querystring 请求http中的查询字符串 var obj=qs.parse(str);将查询字符串转换为js对象 qs.stringfy(obj)将对秀昂转换为 js的字符串
eg:
//用;来加载querystring模块 官方提供好的模块要用常量 只是使用 不修改
//global buffer不用require 优先级别较高
const qs=require("querystring");
//2。创建字符串
var str="uname=tom&ypwd=123&page=3";
//3将字符串转换为js对象
var obj=qs.parse(str);
console.log(obj);
//4对象=》字符串
var obj1={ uname: 'hah', ypwd: '12j3', page: '39' };
var str1 =qs.stringify(obj1);
console.log(str1);
3.3:node.js 官方模块
url模块 用来解析一个http请求地址 获取其中各个不同部分
var obj=url.parse(str);url转对象
var obj=url.parse(str,true)将其中的查询字符串也转换为对象;
egconst url=require("url");
var str="https://jd.com:443/ad/index?uname=hah&upwd=12345&page=50";
var obj2=url.parse(str,true);
console.log(obj2);
3.3:node.js 官方模块
buffer 缓冲区 内存是速度介于 硬盘和cpu之间 本质上是内存的一块区域 用于暂时存储 数据 该区域 叫做缓存区
1. 创建缓冲区 var buffer=Buffer.alloc(1024);
2. 创建一个数字数组的缓冲区
3. var buffer1=Buffer.from([1,2,3,4])
4. 创建一个字符串
5. var buffer2=Buffer.from(“abc”)
6. 缓冲区 将缓冲区转换为字符串
7. //创建 大小为2k的缓冲区 不用requier 优先级较高
var buffer=Buffer.alloc(1024*2);
console.log(buffer.length);
//数组
var buf1=Buffer.from([1,2,3,4]);
console.log(buf1);
//字符串
var buf2=Buffer.from("abhsjsj");
console.log(buf2);
//字符串缓冲区 转换为字符串
var str=buf2.toString();
console.log(str);
8.
3.3:node.js 官方模块
文件读写模块 增删改查
1. 阻塞方案 有顺序 效率低
阻塞的向文件中 var data=fs.readFileSync(“文件名”);
写内容 fs.writeFileSync(文件名,内容) ;先将原有的内容删除新内容
//阻塞方式 读取文件 public/。。。。index.html main.html
//加载fs模块
var fs=require("fs")
//创建两个变量 保存名称
var f1="./public/index.html";
var f2="./public/main.html";
console.log(1);
//读取第一个
var data=fs.readFileSync(f1);
console.log(data);
console.log(2);
//第二个
var data1=fs.readFileSync(f2);
console.log(data1)
文件写入用
var fs=require("fs");
//创建二个变量保存文件名 文件不存在自动创建 文件夹不存在就直接报错
var f1="./public/1.log";
var f2="./public/2.log";
//写入文件
console.log(1);
fs.writeFileSync(f1,new Date().toString);
console.log(2);
fs.writeFileSync(f2,new Date().toString);
console.log(3);
copy文件:先读取写入
var fs=require("fs");
var f1="./public/3.css";
var f2="./public/33.css";
//创建二个变量保存文件名 文件不存在自动创建 文件夹不存在就直接报错
var data=fs.readFileSync(f1);
fs.writeFileSync(f2,data);
console.log(data.toString());
fs.appendFileSync(f2,data);
文件中 追加内容 fs.appendFileSync(文件名 ,内容)
2. 非阻塞方案 无顺序 效率高
不好控制 fs.readFile(fileNmae,(err,data)=>{}) 回掉函数文件读取之后 data就是内容 err是错误
var fs=require("fs");
var f1="./public/3.css";
console.log(1);
fs.readFile(f1,(err,data)=>{
if(err) throw err;
console.log(data);
console.log("读取结束");
})
console.log(2);
console.log(3);
console.log(4);
回调函数参数的顺序不能变;
写入fs.writeFile(文件名,(err)=>{
})追加fs.appendFile(文件名,(err)=>{
})
var fs=require("fs");
var f1="./public/4.css";
var f2="./public/44.css";
fs.readFile(f1,(err,data)=>{
if(err) throw err;
fs.writeFile(f2,data,(err)=>{if(err){throw err;}})
})
注意要在读取文件之中 处理写入文件
http模块 给予http协议客户端程序一 服务器程序;
//创建服务器对象
//创建服务器对象
var http=require("http");
var server=http.createServer();
//绑定端口 端口 1-65535;四个6不行 8888可以
server.listen(8888);
//注册事件 客户端请求事件、 req请求对象 res响应对象
server.on("request",(req,res)=>{
console.log("nodejs服务器端接收到一个请求");
//解析客户端发来的请求消息
console.log(req.method);//请求方法
console.log(req.url);//请求的url
console.log(req.httpVersion);//http协议版本
res.write("hello world");
res.end();
})
//响应客户的消息 res.write()向客户端发送字符串 res.send()响应结束;
作业1:大小小,小小大
大鱼喂小鱼,金色光环特效,漂浮生物
//1:加载http模块
const http = require("http");
const fs = require("fs");
const url = require("url");
//2:创建http服务器
var server = http.createServer();
//3:绑定监听端口
server.listen(3000);
//4:注册事件 request
server.on("request",(req,res)=>{
console.log("node.js 服务器端接收请请求");
//解析客户端发来的请求消息
//console.log(req.method); //GET POST
//console.log(req.url);
//console.log(req.httpVersion); //http协议
var f=null;
var obj = url.parse(req.url,true);
if("/index.html" == obj.pathname){
f="./index.html";
}else if("/login.html" == obj.pathname){
f="./login.html"
}else {
f="./404.html";
}
///index.html
//读取index.html文件内容返回给客户端
fs.readFile(f,(err,data)=>{
if(err)throw err;
res.write(data);
res.end();
});
});
req 请求对象
res.setHeader("Content-Type","text/html;charset=UTF-8");//设置字符集编码
res.write("
打飞机
>");res.end()
实现注册
const http = require("http");
const fs = require("fs");
const url = require("url");
//2:创建http服务器
var server = http.createServer();
//3:绑定监听端口
server.listen(3000);
//4:注册事件 request
server.on("request",(req,res)=>{
console.log(res.url);
console.log("node.js 服务器端接收请请求");
var obj = url.parse(req.url,true);
var f=null;
if("/reg.html" == obj.pathname){
f="./reg.html";
fs.readFile(f,(err,data)=>{
if(err)throw err;
res.setHeader("Content-Type","text/html;charset=UTF-8");
res.write(data);
res.end();
});
}else if("/reg.do" == obj.pathname){
var f1="./login.log";
fs.appendFile(f1,("uname="+obj.query.uname+" "),(err)=>{
if(err)throw err;
})
fs.appendFile(f1,("upwd="+obj.query.upwd+" "),(err)=>{
if(err)throw err;
res.setHeader("Content-Type","text/html;charset=UTF-8");
res.write("注册·完成");
res.end();
})
console.log("a");
}
///index.html
//读取index.html文件内容返回给客户端
});
数据库的种类
1. 关系型数据库
mysql 单表500万 100列行 opracle sql server mysql一秒25次
mogodb redis 20000以上 memcache nosql 你不仅仅是sql
redis高并发 HBASE 1000万列
2. 非关系型的数据库
3.
sql语句的分类·
DDL定义语言 create drop alert
DML操作语句insert update、 delete
DQL查询语句 select
DCL 数据的控制语句 授权 恢复 回收权利 recover grand‘
Nodejs 访问·mysql的服务器
:安装mysql‘的驱动程序
为了精简nodejs的解释器 官方没有提供访问任何数据库相关的抹开I 必须要使用npm工具下载 npm。Js
三部 创建数据库连接
const mysql=require(“mysql:);
var conn=mysql.createConnection({})
3. 发送语句给哦数据库执行
4. conn.query(“sql”,(err,result){})
5. 关闭连接
6. const mysql=require("mysql");
var conn=mysql.createConnection({
host:"127.0.0.1",
user:"root",
password:"",
database:"xz",
port:3306
});
console.log(conn);
//加载mysql模块
var sql="INSERT INTO xz_admin(uname,upwd) VALUES ('kk',md5('123'))";
//创建sql语句 并发送
conn.query(sql,(err,result)=>{
if(err){throw err}
console.log(result);
conn.end();
})
7. 判定添加成功的条件
8. if(result.affectedRows>0){
console.log("添加成功");
}
mysql模块的使用 知道 网络中常见的攻击手段 sql注入 利用规则将危险代码 加入到sql语句里边
占位符技术解决问题
const mysql=require("mysql");
var conn=mysql.createConnection({
host:"127.0.0.1",
user:"root",
password:"",
database:"xz",
port:3306
});
var uname="dingding";
var upwd=123456;
//console.log(conn);
//加载mysql模块
var sql=`SELECT COUNT(uid) as c FROM xz_user WHERE uname=? AND upwd=?`;
//var sql="INSERT INTO xz_admin(uname,upwd) VALUES ('xianghong',md5('66666'))";
//创建sql语句 并发送
conn.query(sql,[uname,upwd],(err,result)=>{
if(err){throw err}
console.log(result[0].c);
if(result[0].c>0){
console.log("成功");
}
else{
console.log('失败');
}
})
创建链接池
const mysql=require("mysql");
const http=require("http");
const url=require("url");
const fs=require("fs");
var server = http.createServer();
var pool=mysql.createPool({
host:"127.0.0.1",
user:"root",
password:"",
database:"tmooc",
port:3306,
connectionLimit:5
});
//3:绑定监听端口
server.listen(3000);
//4:注册事件 request
server.on("request",(req,res)=>{
res.setHeader("Content-Type", "text/html;charset=UTF-8");
var obj=url.parse(req.url,true);
var sname=obj.query.sname;
var score=obj.query.score;
var now=new Date();
var path=obj.pathname;
reg=/^[0-9a-z\u4e00-\u9fa5]{2,}$/i;
if(path=="/add.do") {
if (reg.test(sname) && reg.test(score)){
var sql = "insert into stu values(null,?,?,?)";
pool.query(sql, [sname, score, now], (err, result) => {
if (err) {
throw err
}
console.log(result);
if (result.affectedRows > 0) {
res.write("
登记成功
");res.end();
}
else {
res.write("
登记失败
");res.end();
}
})
}
else{
res.write("
数据格式有误 请检查!
");res.end();
}
}
else if(path=="/add.html"){
fs.readFile("./add.html",(err,data)=>{
if(err){throw err}
res.write(data);
res.end();
})
}
})
js将数组转换为 json字符串
var json=JSON .stringfy(result)
http开发效率有点低
第三方模块 express
简化版本的http;
如果使用官方的http模块 但是这个模快是一个非常底层的模块 推荐使用 http模块进一步封装的 简化模块
该模块的指甲哦顾问景象站http://www.expressjs.com.cn
1. 记载模块
2. var express=require(“express”)
3. var app=express();
4. 创建express对象
5. var server=tttp.CreateServer(app);
6. 创建服务器对象
7. server.listen (3000);
8. 绑定监听端口
9. app.get(“/add.html”,(req,res)=>{
10. res.sendFile(“./add.html”);
11. })
nodejs 2.4
请求方法:
get请求 app.get 表示客户端想要获取服务器资源
post请求 app.post/delete/put 表示客户带要上传 添加文件给客户端 相关数据在请求主体中
put更新指定的主体数据位于服务器上边
delete表示客户端想要删除服务器上边的数据
请求方法用于标明此次请求的目的
浏览器什么方法发送请求:
get:地址栏中直接输入 ajax 表单提交 a标签 超链接
js的跳转 src link-href
post:ajax 表单
put:ajax
delete:ajax
1.ie8 juery2以上不支持ie
2.热部署 nodejs支持热部署
3.post POST post尽量写大写
取参数:
2.5参数
get请求: 两种方式
1.查询字符串
get/user?uid=3&loc=bj app.get(/user",(req,res)=>{
req.query.uid;
query.loc
})
2.接受请求的参数
get/book/js/60 app.get("/book/:name/:price"
req.params.name/price;
})
内部自动创建变量 一一对应
express自动创建属性
res.json(result);
发送json sendFile 发送页面
express实例
const express=require("express");
const http= require("http");
var app=express();
var server=http.createServer(app);
server.listen(3000);
const mysql = require("mysql");
//5:�������ӳ�
var pool = mysql.createPool({
host:"127.0.0.1",
user:"root",
password:"",
database:"tmooc",
port:3306,
connectionLimit:5
});
app.get("/stu/:sid",(req,res)=>{
var sid= req.params.sid;
//res.send(id);
var sql = "SELECT * FROM stu where sid=? ";
pool.query(sql,[sid],(err,result)=>{
if(err)throw err;
res.json(result);
});
})
关于http协议:
请求是客户端发送给服务器的 响应是服务器发送给客户端的
发送一次请求 只会得到一次响应
1. 请求的详细个事
1. 请求起始行(请求方式:get没有请求主体 post有主体 put有主体 delete head表示客户端获取服务器上的资源只有响应头不要响应主体
,trace追踪请求路径 connection 测试连接 options保留以后使用
2.请求头:1.host.www..tmooc.cn 客户端告诉服务器此次请求的虚拟主机 2.connection:keep-alive 持久链接 3.cache-control缓存 4.user-agent客户端告诉服务器自己是什么类型 5.每次请求都会带上cookie 请求主体的描述 content-length:36 请求字节
2响应其实行:
今天学习的内容
1:复习上一周重点;http协议
2:今天的目标
2.1:nodejs--express--项目(学子商城)
nodeadmin
public---保存所有静态网页资源(html;css;image)
app.js--项目的入口程序
pool.js-连接池
node_modules/mysql+express
2.2:用户管理
2.3:用户列表
(1)用户分页显示
app.js
GET /users?pno=3&pageSize=10
#参数 pno pageSize
#sql
SELECT count(uid) as c FROM xz_user 总记录数
SELECT uid,uname,email,phone, avatar, user_name
FROM xz_user
LIMIT ?,?
#json
{pno:3,pageSize:10;pageCount:5,data:[]}
常见错误:
1: Error: Cannot find module 'express'
当前目录或上级目中node_modules/没有express
node.js/day04/ node_modules{mysq;express}
2:
(2)删除指定用户
(3)更新指定用户信息[密码]
(4)详细
2.4:用户检索
return;
➡️错误时使用 阻止程序执行
非阻塞 设置progress来保证函数执行顺序
静态资源的中间件
app.user(express.static(“public”)) express
实例
http://127.0.0.12:3000/user_list.html
读取public下边的所有资源
pool.js 导出pool
const mysql = require("mysql");
//2:创建连接池对象
var pool = mysql.createPool({
host:"127.0.0.1",
user:"root",
password:"",
database:"xz",
port:3306,
connectionLimit:5
})
//3:输出对象
module.exports = pool;
app.js nodejs创建服务器
const pool = require("./pool");
//1:加载指定模块 http;express;pool
const http = require("http");
const express = require("express");
//2:创建express对象
var app = express();
//3:创建server对象
var server = http.createServer(app);
//4:绑定监听端口 3000
server.listen(8888);
//4.1制定静态资源的目录
app.use(express.static("public"));
//功能一:用户分页显示
//GET /users ?pno=3&pageSize=10
// users.php (req,res)=>{...}
app.get("/users",(req,res)=>{
//5:接收请上请求
//5.1:获取二个参数
var pno = req.query.pno;
var pageSize = req.query.pageSize;
//5.2:默认值 1 pageSize 10
//http=res.setHeadr()+res.write()+res.end();
if(!pno){ pno = 1;}
if(!pageSize){pageSize=10}
//res.send(pno+"_"+pageSize);
//5.3:正则表达式验证pno pageSize
var reg = /^[0-9]{1,}$/;
//res.setHeader+json+write+end
if(!reg.test(pno)){
res.json({code:-1,msg:"页码格式有误"});
return;
}
if(!reg.test(pageSize)){
res.json({code:-1,msg:"页大小格式有误"});
return;
}
//结果对象
var output = {pno:pno,pageSize:pageSize};
var progress = 0;
//5.4:创建二个sql 总记录数 当前页内容
var sql = "SELECT count(uid) as c FROM xz_user";
pool.query(sql,(err,result)=>{
if(err)throw err;
var pageCount = Math.ceil(result[0].c/pageSize);
output.pageCount = pageCount;
progress+=50;
if(progress==100){
res.json(output);
}
});
//node.js 对占位符参数类型严格
pno = parseInt(pno);
pageSize = parseInt(pageSize);
var offset = (pno-1)*pageSize;
var sql = " SELECT uid,uname,phone,email";
sql +=" ,avatar,user_name FROM xz_user";
sql +=" LIMIT ?,?";
pool.query(sql,[offset,pageSize],(err,result)=>{
output.data = result;
progress+=50;
if(progress==100){
res.json(output);
}
});
//5.4:发送并且创建结果对象
});