===================================================================================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 响应内容
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 响应内容
练习:创建路由,请求方法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 姓名: 性别: 生日: 工资: 部门: 提交