var htttp = require('http') 加载http模块var server = http.createServer(function(req,res){ 建立一个服务器 req请求 res响应 req.url 请求地址 res.write() 给浏览器端输出 res.end() 结束})server.listen(8080) 监听path 工具函数 1 path.join([path1][, path2][, ...]) 用于链接路径。 2 path.resolve([from ...], to) 将 to 参数解析为绝对路径。 3 path.resolve(from, to) 用于将相对路径转为绝对路径。 4 path.parse(pathString) 返回路径字符串的对象。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。文件操做:fs -----file system 文件系统的缩写var fs = require('fs') 加载fs模块fs.readFile(文件名,回调函数) 读文件/异步操做 回调函数有两参数 err data/读到的数据fs.writeFile(文件名,要写的内容,回调函数) 写文件 回调函数有一个参数 errfs.rename('原来文件名','如今名字',function(err){})。。。。。。。。。。。。案例练习。。。。。。。。。。。。。。。。var http = require('http')var fs = require('fs')var server = http.createServer(function(req,res){ var fileName = './www'+req.url; //根目录下面有个www文件夹 fs.readFile(fileName,function(err,data){ if(err){ res.write('404') }else{ res.write(data) } res.end() })})server.listen(8080)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。数据请求get请求 req.json({key:value}) 给前端发送数据,前端经过ajax请求获得数据 req.url //get数据存在url上 querystring 模块 把username=blue&age=18转换成json{username:blue,age:18} querystring.parse('username=blue&age=18')-> {username:blue,age:18} querystring.stringify 跟querystring.parse做用反过来 url模块 专门用来解析地址的 把http://baidu.com?username=blue&age=18解析 var obj = url.parse('http://baidu.com?username=blue&age=18',true) => obj.pathname-> http://baidu.com obj.query-> {username:blue,age:18}post请求 数据分段发送 var str='' req.on('data',function(data){ data有一段数据到达就会触发一次 str+=data }) req.on('end',function(){ end数据所有到达触发一次 console.log(str) 这里str已是完整数据 })var server = http.createServer(function(req,res){ 建立一个服务器 req请求 res响应 req //来接受前台传过来的数据}) 第二种方法经过中间件body-parser app.use(bodyParser.urlencoded({extended:false})).......................................................................................http:协议 协议流程 1 http客户端发起请求,建立端口 2 http服务器在端口监听客户端请求 3 http服务器想客服端返回状态和内容浏览器后计算机 访问一个 地址的大概操做步骤1. 浏览器(如Chrome)搜索自身的DNS 缓存2. 搜索操做系统自身的DNS缓存(浏览器没有找到缓存或缓存已经失效)3. 读取本地的 HOST 文件4. 浏览器 发起一个DNS 的 一个系统调用5. 浏览器得到域名对应的 IP 地址后,发起 HTTP 的“三次握手🤝”6. TCP/IP 链接创建起来后,浏览器就能够向服务器发送 HTTP 请求了,例如使用 HTTP 的 GET 方法请求一个根域里的一个域名,协议能够采用 HTTP 1.0 的一个协议。7. 服务器端接收到了这个请求,根据路径参数,竞购后端的一些处理后,把处理的一个结果的数据返回给浏览器,若是是 目标网 的页面就会把完整的 HTML 页面代码返回给浏览器。8. 浏览器拿到了 目标网 的完整的HTML 页面代码,在解析和渲染这个页面的时候,里面的 JS 、CSS、 图片静态资源,他们一样也是一个个 HTTP 请求,都须要上面的主要七个步骤9. 浏览器根据拿到的资源对页面进行渲染,最终把一个完整的页面呈现给用户.......................................................................................EventsEmittervar EventsEmitter = require('events').EventsEmittervar life = new EventsEmitter()life.on('事件名',对应函数) //监听最多为10个life.emit('事件名')######################################################################################模块化 系统模块 Crypto加密 Events事件 Net网络操做 OS操做系统信息 Path处理文件路径 stream流操做 自定义模块 require 引入模块 通常是引入系统模块 只要require('http') 有'./'从当前目录找,没有'./' 从系统模块或者node_nodules文件夹找 module 模块输出批量 //module.exports ===exports module.exports={} exports 单个输出 exports.a=12 向外输出一个变量a 包管理器 npm install下载 publish上传包 unpublish删除包、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、express框架 保留了原生的功能,添加了一些方法 const express = require('express') 模块引入 const server = express() server.use('地址',function(req,res){ 添加一个响应或者说处理请求 // res.send('123') res.redirect('地址') 重定向 地址是跟着根目录走的 res.end() }) server.listen(8080) 。。。。。。。。。。。。。。。。。。。。。。。。。。。 server.get('/',function(req,res){}) 只接受get请求 server.post('/',function(req,res){}) 只接受post请求 server.use('/',function(req,res){}) 不管是get 仍是post 最后都会走到use express 中间件或者插件 1.express-static 处理静态文件 使用法法 server.use(expressStatic('./www')) 2.body-parser server.get('/',function(req,res){ req.query //get方式传递过来的数据,无需中间件支持 req.body //post方式传递过来的数据,需body-parser支持 用以前需 server.use(bodyParser.urlencoded{extended/扩展模式:false,limit/大小限制:2*1024}) }) ********************************************* express的链式操做 server.use('/',function(req,res,next){ console.log('a') next() //必需要有next才会执行下面代码 }) server.use('/',function(req,res,next){ console.log('b') })、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、cookie ,session cookie 在*********浏览器保存一些数据**********,每次向服务器发送请求都会带过来,只有4k,不安全 session 保存数据,****保存在服务器端****,存储大,安全 session 基于cookie实现的,cookie中会有session的id,服务器就是利用sessionid找到session文件,读取,写入 隐患:session劫持 在/aaa/bbb 路径下设置了一个cookie 那么在/aaa和/目录下均可以访问这个cookie 反之不行 cookie 1,读取 --基于cookie-parser来读起cookie 用法 server.use(cookieParser('密钥'))//在req上加个cookies和signedCookies,加了密钥就能够把有密钥的cokie解析 server.use('/aaa/html',function(req,res){ req.signedCookies //读取加密钥的cookie req.cookies //读取没有加密钥的cookie res.cookie('user','cy',{path(在aaa路径下才能访问这条cookie):'/aaa',maxAge(cookie过时时间):30*24*3600*1000,signed(签名密钥):true}) //发送设置一个cookie res.clearCookie(删除cookie名字) 删除cookie }) session 利用cookie-session中间件 用法server.use(cookieSession({keys:[]//必须加密钥数组,maxAge:过时时间,以毫秒为单位})) 用session必须先server.use(cookieParser()) 而后在server.use(cookieSession({})) //在req加session 设置req.session['key']=value 解析好的session在req.session 删除delete req.session&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&模板引擎---------jade-ejs-swig jade 侵入式 jade.renderFile('文件',{pretty(格式美化):true}) 使用方法 html //缩进表明子元素 body div 属性格式----属性放()里面,逗号隔开 script(src='a.js') ==><script src='a.js'></script> style有两种写法 1.style={width:'100px'} 2.style='width:100px' class有两种写法 2.class=[clasa,clasb] 2.class='clasa clasb' 内容格式 1.空一个格直接日后写 p 内容==><P>内容</p> | 表明|后面的内容原样输出 . 表明子(里面)的东西都原样输出 div. - 表明后面是一段js代码 div!表明不须要转义输出html include 引入外部文件 #{变量名} 表明变量 特殊 style=变量,class=变量 不须要加#{} span #{a} 等价于 span=a 都输出<span> 变量a</span> ------------------------------------------------------------------------------------- ejs 非侵入式 ejs.renderFile('文件',{数据},function(err){}) 页面中用变量 <%= 变量名 %> =转义输出 -不转义输出 <% for(){ %> <% } %> <% include %> 引入。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。body-parser 只能解析上传数据不能解析上传的文件设置 <form enctype='multipart/form-data'> <input type='file' > </form>multer 能够解析数据跟上传文件如图片 var multer =require('multer') var obgMulter =multer({dest(存储路径):'路径'}) 用法server.use(obgMulter.any()) 在req上加了一个files 上传上的文件 req.files=[{文件各类属性}]multer解析完上传文件后,会被保存为一个包含如下字段的对象 req.files=[{文件各类属性}]: fieldname - 表单提交的文件名(input控件的name属性) originalname - 文件在用户设备中的原始名称 encoding - 文件的编码类型 mimetype - 文件的Mime类型 size - 文件的大小 destination - 文件的保存目录(DiskStorage) filename - 文件在destination中的名称(DiskStorage) path - 上传文件的全路径(DiskStorage) buffer - 文件对象的Buffer(MemoryStorage)..............................................path 模块 var path =require('path') var src='c:\\wamp\\www\\a.html' var obj =path.parse(str) obj={ base:文件名部分包括扩展名, ext: 扩展名, dir: 路径 name:文件名不包括扩展名 } path.resolve(_dirname,'/public') 把相对路径转换成绝对路径。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 consolidate --适配,整合模板引擎到express里面 配置模板引擎三步 2 用哪一种模板引擎 2模板文件放哪儿 1输出什么东西 var consolidate = require('consolidate') server.set() 对整个server的全局配置 server.set('view engine','html') //输出什么东西 server.set('views','./views') //模板文件在哪儿 server.engine('html',consolidate.ejs) //用哪一种模板引擎######################################################################################router-路由 把不一样的目录对应到不一样的模块 var userRouter = express.Router() //迷你server server.use('/user',userRouter) //挂载在server下面 userRouter.get('/1.html',function(req,res){}) //客户访问/user/1.html。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。数据库 数据库里面不能储存名文密码 加密以后才存 MD5签名算法 MD5给密码签名加密 const crypto = require('crypto') var obj = crypto.createHash('md5') var 后缀 =‘一串随机符号’ obj.update('加密的东西'+后缀) str = obj.digest('hex') 获取16进制的结果 MySQL: server端 client端 数据基本概念 两种单位 1库:文件夹/用来管理表,自己无法存数据 2表:文件-存储数据的 行:一条数据 列:数据库里面不叫列,叫字段,表明一项数据 主键:惟一的标识符,性能更高 node中的mysql模块 是客户端 两部 1连接服务端2查询 var mysql = require('mysql') mysql.createConnection(哪台服务器,用户名,密码,操做哪一个库) //连接服务端 mysql.createPool(哪台服务器,用户名,密码,操做哪一个库) 连接池 var db =mysql.createConnection({host:'localhost',user:'root',password:'123456',database(数据库名):'2016222',port:'3036'}) db.query(干啥,回调函数) //查询 db.query('SQL语句',function(err,data){}) SQL:结构化查询语句 SQL标准写法 1:关键字大写 2库表字段写反引号 4大查询语句--增删改查 增 INSERT insert into 表 (字段列表) values(值列表) 如 INSERT INTO `user_table` (`ID`,`username`,`password`) VALUES (0,'chengyuan','123456') 删 DELETE delete from 表 where 条件 改 UPDATE update 表 set 字段=值,字段=值 where 条件 查 SELECT select 什么 from 表 where 条件 如 SELECT * FROM `user_table` select * from user limit 0,5 从匹配到的数据里面从0条开始 选择5条 WHERR age>=18 AND score>100 WHERR age>=18 OR score>100 ORDER 排序 ORDER BY age ASC升/DESC降 多条件排序 ORDER BY price ASC, sales DESC GROUP BY 聚类-合并相同的,相同的数据只保留一条,通常配合COUNT(计数)MIN(最小),MAX(最大),AVG(平均值),SUM(总和)一块儿使用 COUNT() 计数 求每一个班的平均分 SELECT class,AVG(score) FROM stundent_table GROUP BY class 求每一个班的最高最低分 SELECT class,MIN(score),MAX(score) FROM stundent_table GROUP BY class class min-score max-score 获得数据是 1 30 100 2 40 99 LIMIT --限制输出 LIMIT 10 前10条 LIMIT 5,8 从第五条开始 要八个 route //至关于小型express 把一个大项目拆分红许多小模块 var route = require('express-route') ////////////////////res.json() 给前端传json数据当路由地址是 'user/:id' user/100 => req.params.id获取到100cheerio 能够理解成一个 Node.js 版的 jquery,对语法不明白的先去学下jquery。redis