===================================================================================day01
2.nodejs 概述
(1)对比JS和nodejs
JS运行在浏览器端,有很多浏览器,代码存在兼容性;
nodejs在服务器端只有一个环境,代码不存在兼容性。
两者都有内置对象、宿主对象、自定义对象;JS中宿主对象BOM&DOM,nodejs有大量的扩展对象。
JS用于浏览器端的交互效果,nodejs用于服务器端的操作,例如数据库的操作,文件的操作…
(2)nodejs运行模式
脚本模式
node c:/xampp/…/01.js 回车
交互模式
node 回车 进入交互模式
退出:ctrl+c两次 .exit回车
3.全局对象
nodejs:global
在交互模式下,声明的变量和创建的函数都属于是全局对象下的,可以使用global来访问;
例如:var=1; 可以global.a访问
脚本下,文件中的变量和函数都不是全局对象下的,不能使用global来访问。
JS:window
在浏览器下,文件中的变量和函数都是全局对象的,可以使用window来访问。
例如 var a=1;window.a
(1)console对象
global.console.log 全局对象console下的方法(log) mda
global.console.log( ); 打印日志
global.console.info( ); 打印消息
global.console.warn( ); 打印警告
global.console.error( ); 打印错误
global.console.time(‘for’); 开始计时
global.console.timeEnd(‘for’); 结束计时
开始和结束的字符串要保持一致
练习:使用计时查看计算 for while do-while 循环100000次的耗时
(2)process对象
process.arch 查看当前CPU架构
process.platform 查看当前的操作系统
process.version 查看当前nodejs的版本号
process.pid 查看当前的进程编号
process.kill() 通过进程编号杀死某一个进程
(3)Buffer对象
缓冲区:在内存中存储数据的区域
创建buffer
var buf=Buffer.alloc(5,‘abcde’)
将buffer数据转为字符串
buf.toString()
(4)全局函数
parseInt/parseFloat/isFinite/encodeURI/decodeURI/eval
一次性定时器
setTimeout(回调函数,间隔时间)
当间隔时间到了,会执行回调函数;单位是毫秒
clear.Timeout(timer) 清除一次性定时器
周期性定时器
var timer=setInterval(回调函数,间隔的时间)
每隔一段时间,执行一次回调函数
clearInterval(timer) 清除周期性定时器
练习:使用周期性定时器每隔三秒钟打印‘hello’,打印三次后清除定时器。
记录次数,每打印一次加1,判断是否为3,是的话清除
立即执行
setImmediate(回调函数)
clearImmediate(timer)
process.nextTick(回调函数)
3.模块
模块就是一个独立的功能体,每一个文件、目录都可以称为模块。
在nodejs下模块分为自定义模块,核心模块(官方提供)、第三方模块
nodejs自动会给每一个模块添加构造函数
(function(exports,require,module,_filename,_dirname){
//程序员写的代码
})
require() 是一个函数,用于引入一个模块
module 指代当前的模块
module.exports 是当前模块导出的对象,是供其它的模块使用的属性和方法(公开的内容)
exports 等价于 module.exports
课后任务
(1)复习今天内容,整理思维导图
(2)练习
创建两个模块,主模块(main.js)和功能模块(circle.js);在功能模块中创建两个函数,分别传递一个参数(半径),机选圆的周长和使用面积,导出这两个函数;在主模块中引入功能模块,并调用两个函数。
(3)预习querystring,url,fs模块
复习
全局对象
nodejs:global js:window
function fn(){
}
交互模式下是全局的/脚本模式下不是
console无论写在哪里都是全局下的
console.log/info/warn/errpr/time/timeEnd
prodess用于查看进程相关的
process.arch/platform/env/version/pid/kill()
Buffer用于操作缓冲区
Buffer.alloc(5,‘abcde’) toString() Buffer二进制转字符串用
setTimeout/clearTimeout
setInterval/clearInterval
setImmdiate/clearImmdiate
process.nextTick 早于setImmdiate
模块系统
(function(exports,require,module,_filename,_dirname){
//写的代码
module. exports=== exports
})
require
module指代当前模块
=================================================================================day02
1.模块中的参数
_filename 当前模块的完整路径和模块名称
_dirname 当前模块的完整路径
2.模块
以路径开头 不以路径开头
文件模块 require(’./circle.js’)
常用于用户自定义模块,如果后缀名为js,可以省略 require(‘querystring’)常用于引入官方提供的核心模块
目录 require(’./02_2’)
到02_2目录下寻找package.json 文件中main属性对应的模块,如果找不到引入index.js require(‘04_2’)会自动到node_modules中寻找目录模块04_2,如果,当前目录没有,会继续往上一级目录寻找,直到顶层目录,常用于第三方模块
练习:创建模块03_1.js,引入当前目录下03_2目录模块;在03_2下含有文件fun.js,导出一个函数add(计算两个数字相加),在03_1.js中引入并调用
练习:在05目录下创建05_1.js,引入不以路径开头的目录模块05_2,包含文件focus.js,在文件中导出函数计算三个数字相加,在05_1.js中引入并调用
3.包和npm
包:package,就是mode_modules下的目录模块,其中含有package.json文件,是包说明文件
npm:用于下载安装包的工具
下载的网站:www.npmjs.com
切换到下载的目录
cd 完整的路径
进入要安装的目录,在空白区域按住shift键,单击鼠标右键,在此处打开powershell窗口
使用npm安装
npm install mysql 回车
4.查询字符串模块
查询字符串:浏览器向服务器发请求,传递数据的一种方式
http://www.jd.com/search?ky=电脑&lid=20
parse() 将查询字符串格式化为对象
stringigy() 将对象转换成查询字符串
练习:获取百度搜索中查询字符串中的关键字 手机
ie=utf-8&tn=baidu&wd=手机
5.URL模块
操作URL
parse() 将URL格式化为对象
protocol 协议
hostname 主机名(域名/IP地址)
port 端口
pathname 请求的文件在服务器上的路径
query 查询字符串
format() 将对象转换成URL
练习:获取URL中查询字符串中的数据。
http://www.codeboy.com:8080/web/1902.html?sid=10&name=tom
将URL格式化为对象,获取查询字符串
将查询字符串格式化为对象,获取到数据
08_exercise.js
6.文件系统模块
(1)查看文件的状态
fs.stat(fd,callback)/fs.statsSync(fd)
fd 文件的路径
callback 回调函数,用来查看结果
err 可能产生的错误信息
stats 具体的文件状态
isDirectory() 是否为目录
isFile() 是否为文件
对比同步和异步操作
同步:会阻止后边代码的执行,只有执行完毕才会执行后边代码;是通过返回值获取结果
异步:不会阻止后边代码的执行,放在整个线程的最后执行;是通过回调函数获取结果。
(2)创建目录
fs.mkdir(fd,callback)/fs.mkdirSync(fd)
(3)移除目录
fs.rmdir(fd,callback)/fs.rmdirSync(fd)
(4)读取目录
fs.readdir(fd,callback)/fs.readdirSync(fd)
callback 回调函数
err 可能产生的错误
files 读取目录中的文件
练习:读取目录05中的文件有哪些
(5)写入(创建)文件
fs.writeFile(fd,data,callback)/ fs.writeFileSync(fd,data)
fd 文件的路径
data 要写入的数据
callback 回调函数
如果文件不存在创建文件,如果文件已经存在,会清空文件中的内容,然后写入。
(6)追加写入(创建)
fs.appendFile(fd,data,callback)/ fs. appendFileSync(fd,data)
练习:在文件num1.txt中写入’hello’,运行多次
课后任务
(1)复习今天内容,整理思维导图
(2)练习:
创建目录mydir,在该目录下创建文件data.txt,并写入以下数据,每个对象中的数据占一行
[{id:1,name:‘tom’,age:18},{id:2,name:‘kate’,age:20}]
=====================================================================================day03
复习
一路径开头 不一路径开头
文件模块 require(’./circle.js’) require(‘fs’)
目录模块 require(’./04_2’)
package.json中的
main属性 require(‘mysql’)
到node_modules中寻找目录模块mysql
包和npm
npm install包名称
querystring 查询字符串模块
parse/stringify
url模块
parse/format
fs文件系统模块
stat/statSync/mkdir/rmdir/readdir/wirteFile/appendFile
同步/异步(快,不影响其它)
=============================================================================day03
1.fs模块
(1)判断文件是否存在
fs/existsSync(path) 判断文件是否存在
存在true 不存在false
(2)读取文件
fs.readFile(fd,calback)/fs.readFileSync(fd)
fd 文件的路径
callback 回调函数
err 可能产生的错误
data 读取的数据,格式为buffer
练习:完成一个文件计数器。
判断文件num.txt是否存在,不存在创建,并写入数据0;读取num.txt中的数据,然后让读取的值加一,并打印;把加1的值再次清空写入到num.txt中
03_num.js
2.http协议
是浏览器和web服务器之间的一种通信协议
(1)通用头信息
Request URL:对应浏览器地址栏内容,要向服务器获取哪些内容
Request Method:请求的方法,GET/POST…,获取内容的方式
Status Code: 响应的状态码
1**:正在请求,没有结束
2**:成功的响应
3**:响应的重定向,跳转到另一个网站;通常结合着响应头信息中location一起使用
4**:客户端错误
5**:服务器端错误
Remote Address:请求的服务器的IP地址和端口
(2)响应头信息
Connection:连接的方式,keep-alive持续连接
Content-Type:响应文件类型
Content-Length:响应的文件长度
Location:当响应重定向的时候,跳转的URL
(3)请求头信息
Accept:客户端接受的文件类型有哪些
Accept-Encoding:客户端接受的文件压缩形式
User-Agent:客户端发送请求使用的浏览器
(4)请求主体
可有可无,客户端向服务器端传递数据
3.http模块
既可以模拟浏览器向服务器端发请求,也可以创建web服务器
(1)模拟浏览器
http.get(url,callback)
get 请求的方法
callback 回调函数,用来获取服务器端的响应
res 响应的对象
statusCode 获取响应的状态码
res.on(‘data’,function(buf){ })
通过事件来获取响应的内容,当有数据传递自动触发,通过回调函 数来接收响应的内容
buf 就是响应的内容,格式为buffer
练习:使用http模块下的get方法向tmooc发请求,并获取响应的状态和响应的内容05_exercise.js
http://www.tmooc.cn/course/100072.shtml
(2)创建web服务器
var server=http.createServer() 创建web服务器
server.listen(8080) 分配8080端口,监听端口变化
server.on(‘request’,function(req,res){ })
接收浏览器的请求,是一个时间,当有请求自动触发,通过回调函数来接收请求,做出响应
req 请求的对象
url 请求URL,显示端口后的部分
method 请求的方法
headers 请求的头信息
res 响应的对象
writeHead(code,obj) 设置响应的状态码和头信息
code 状态码 obj 头信息对象
write() 设置响应的内容
end() 结束响应,并发送响应内容到浏览器
练习:创建web服务器,监听端口8081,接收浏览器的请求
/login 响应内容 this is login page
/member 响应内容
welcom
/ 重定向到 /login
以上都没有 响应内容 404 not found
07_http_server.js
4.express框架
基于nodejs,快速、开放、极简的web开发框架
www.expressjs.com.cn
安装 npm install express
(1)路由
浏览器向web服务器发请求,web服务器根据请求的方法和请求的URL来做出响应
三要素:请求的方法、请求的URL、响应(回调函数)
课后任务
(1)复习今天内容,整理思维导图
(2)练习
使用http模块创建web服务器,接收浏览器的请求,根据请求的URL来做出不同的响应
/index 响应内容 this is homepage
/login 响应内容
please login
/ 重定向 /index
其它 响应 404 not found
(3)预习浏览器向服务器发送请求的方式get、post
===============================================================================day04
http 协议
通用头信息
请求方法、请求URL、响应状态码
响应头信息
Conten-Type:text/html text/plain
Location:url /index
请求头信息
请求主体
http模块
向服务器发请求
http.get(url,function(res){ res.statusCode
res.on(‘data’,function(buf){
})
})
创建web服务器
http.createServer()
listen(8080)
express框架
express()
listen(8080)
路由
===============================================================================day04
1.express框架
(1)路由
req 对象
method 请求的方法
url 请求的URL
headers 请求的头信息
query 获取查询字符串数据,格式化为对象
res对象
send() 响应内容并发送,不能多次使用,如果是数字,需要转成字符串
sendStatus() 响应状态码对应的中文 200->ok
sendFile() 响应文件并发送
redirect() 响应的重定向
练习:创建路由并响应
get /index 响应
这是首页
get /member 响应文件member.html
get / 响应重定向到/index
post /register 响应 注册成功
2.post和get
post请求是通过表单提交(现阶段)来传递数据,服务器端是通过事件来获取数据,后期可以使用中间减件简化。
req.on(‘data’,function(buf){
buf 就是获取的数据,格式为buffer,需要使用查询字符串模块格式化对象
})
get请求通过查询字符串传递数据,服务器端使用req.query获取数据,结果是对象
post 请求安全性较高,速度较慢,注册、登录使用post提交。
get请求安全性较低,速度较快,搜索中使用get提交。
练习:创建路由,请求方法get,请求的URL:/reg,响应一个文件reg.html;在html创建注册的页面(用户名,密码,手机),向服务器发送get请求,请求URL:/myreg,响应“注册成功”
3.使用路由传递数据
设置路由中接收的名称
server.get(‘detail/:lid’,function(req,res){
req.params //获取路由传递的数据,格式为对象
})
浏览器传递数据
http://127.0.0.1:8080/detail/5
5就是传递的数据,被lid所接收
练习:创建购物车的路由,请求方法get,请求 URL:/shopping,传递商品的价格price和名称pname,把接收的两项响应到浏览器中。
4.路由器
路由在使用过程中,不同模块下的路由可能出现相同的URL,把同一个模块下的路由挂在到特定的前缀,例如:商品模块下的列表路由 /product/list,用户模块下的列表由 /user/list
路由器就是自定义的模块,存放了所有模块下的路由
const express=require(‘express’);
var router=express.Router(); //创建空的路由器对象
router.get(’/list’,function(req,res){ }); //往路由器添加路由
module.exports=router;
web 服务器下使用路由器
const userRouter=require(’./user.js’); //引入路由器模块
server.user(’/user’,userRouter); //把路由器挂载到/user下,访问形式/user/list
练习:创建商品模块路由器(product.js)添加路由商品列表、商品删除,在web服务器下引用,并挂在到/product 。
5.中间件
中间件作用为主要业务逻辑所服务
分为 应用级中间件,路由级中间件,内置中间件,第三方中间件,错误处理中间件。
(1)应用级中间件
每一个中间件都是一个函数,需要配合其它的中间件或者路由使用。
server.use(function(req,res,next){ }) 拦截所有请求
server.use(’/reg’,function(req,res,next){ }) 拦截特定的请求,当请求的URI为/reg,猜会执行回调函数。
练习:创建路由(请求方法get,请求URI:/view),响应当前的浏览次数,每次浏览,响应次数加1,
在中间件外部创建变量,设置初始值0,在中间件中变量加1,在路由中响应浏览次数(变量) send(0)
(2)路由级中间件
将路由器挂载到特定前缀,就是使用路由级中间件
server.use(’/user’,userRouter);
课后任务
(1)复习今天内容,复习mysql的SQL语句
(2)练习:
创建web服务器,向服务器请求查询生日文件(birth.html),在html中点击提交再次向服务器发请求,根据身份证号显示出生的年月日和性别(中间件),在路由中响应到浏览器
身份证号 提交
===========================================================================day05
3.内置中间件
express中只保留了一个内置的中间件
server.use(express.static(‘目录’));
托管静态资源到某个目录,如果浏览器请求静态资源,自动到该目录下寻找,无需使用路由响应文件
静态再远:html,css,客户端js,img…
练习:托管静态再远到files目录下,如果同时出现两个相同的文件,显示哪一个目录下的
4.第三方中间件body-parser
可以将post请求的数据直接格式化为对象
//引入 body-parser
server.use(bodyParser.urlencoded({
extended:false
}));
urlencoded:将post请求数据格式化为对象
extended:不使用第三方qs模块,而使用核心模块querystring将查询字符串格式化为对象
在路由中获取post请求数据
req.body 返回对象
5.myspl
连接mysql数据库
mysql.exe -h127.0.0.1 -P -uroot -p
进入数据库 use xz;
INSERT INTO emp VALUES(…);
DELETE FROM emp WHERE id=3;
UPDATE emp SET ename=‘tom’,sex=0 WHERE eid=1;
SELECT eid,ename FROM emp;
(1)普通连接
var connection=mysql.createConnection({});创建连接对象,提供mysql服务器的主机名,端口号,用户名,密码,连接后要使用的数据库。
connection.connect(); 执行连接
connection.query( sql,function(err,result){ })
sql 要执行的SQL语句,result,SQL语句的执行结果
connection.end() 关闭连接
(2)使用连接池
var pool=mysql.createPool({ }); 创建连接池对象,传递主机名,端口号,用户名,密码,使用的数据库,连接池大小。
pool.query(sql,callback)
在SQL语句中可以使用占位符?
练习:创建web服务器,托管静态资源到public下,创建add.html(包含部门编号,部门名称) 06——add.js
点击表单中的提交按钮,向服务器发送请求,请求方法:post,请求URL:/add,创建对应的路由获取提交的数据
将服务器接收的数据插入到tedu
课后任务
(1)复习今天内容,整理思维导图
(2)创建web服务器,托管静态资源,点击提交,将数据插入到tedu数据库下的emp
姓名:
性别:
生日:
工资:
部门:
提交