一、什么是node.js
1、node.js
1.Node.js 就是运行在服务端的 JavaScript
2.Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。
3.Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
2、node的特点
1.异步I/O
```
$.post('url',,{title:'学习node的笔记'},function(data){
console.log('收到相应')
})
console.log('发送Ajax结束')
```
2.事件与回调函数
3.单线程
4.跨平台
node.js创建第一个应用
可以直接在命令行(黑窗口)运行.js文件(不推荐使用)
最优选择:新建.js 文件
1.引入require模块
var http = require('http');// const http = require('http');
2.创建服务,服务器可以监听客户端的请求
var server = http.createServer(function(req, res) {
console.log('111');
});
3.监听请求
server.listen(8081);
二、npm
npm由三部分组成
1.网站
2.注册库(registry)
3.命令行工具(CLI)
+ 网站是开发者使用npm的最基本方法,包括发现/查找package,编写说明,管理他们的npm各个方面。
+ 注册库(registry)是一个关于package信息的一个巨大的库。
+ CLI 通过命令行或者终端,这是开发者通过CLI与npm打交道的途径。
实例——找到一个package
例如,假设你想为你的应用找一个条形码(二维码),预期花费数周时间来设计和实现,还不如去看下是否有人已经上传了一个二维码的package。
1.从搜索框输入值开始
2.相关选项将出现
3.或者点击,去过滤更多的有可能的
4.当你选择一个package去探索,更多的信息会展示出来,这些信息是package的作者写的,很详细。
5.现在你可以浏览开发者文档,去学习如何使用这些package。
三、文件系统 fs
readFile('文件名',function(err,data){})
writeFile('文件名','新增内容',function(err,data){})
同步和异步
// 异步读取
fs.readFile('1.input.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("异步读取: " + data);
});
// 同步读取
var data = fs.readFileSync('1.txt');
console.log("同步读取: " + data.toString());
常用的语法
fs.open(path, flags[, mode], callback)
参数:路径,打开文件的行为(只读、读写等),文件的模式,回调
fs.open(path, flags[, mode], callback)
fs.close(fd, callback) // fd 通过 fs.open() 方法返回的文件描述符
四、get post
get 在url中 数据跟在url后边的
post 不在url中 数据单独发的
GET 数据解析
1、自己切
2.querystring xxx=xx&xx=xx
3.urlLib aa?xxx=xx&xx=12
urlLib.parse(url,true) pathname/query
url
const urlLib = require('url')
var obj = urlLib.parse('http://www.bufanui.com/index?a=2&b=5',true) //加上true 自动将query解析成json
console.log(obj);
Url {
protocol: 'http:',
slashes: true,
auth: null,
host: 'www.bufanui.com',
port: null,
hostname: 'www.bufanui.com',
hash: null,
search: '?a=2&b=5',
query: 'a=2&b=5',
pathname: '/index',
path: '/index?a=2&b=5',
href: 'http://www.bufanui.com/index?a=2&b=5' }
querystring
const querystring = require('querystring')
var json = querystring.parse("user=shi&pass=shi")
console.log(json);//{ user: 'shi', pass: 'shi' }
post
数据量大,url集中在内容
分段发送
五、模块化
1、系统模块:http/querystring/url
2、自定义模块:
3、包管理器(npm)
系统模块:
断言:Assert
Buffer
c/c++ 扩展
Crypto 加密
Path 处理文件路径
Stream 流操作
。。。
自定义模块
1.模块的组成
require 请求,引入其他模块的 (系统模块、自定义模块)
modules 模块,批量对外输出
exports 输出,对外输出
2.npm (NodeJS Package Manager) 包管理器
1.统一下载途径
2.自动下载依赖
3.node_modules 存放依赖
( 如果有./ 从当前目录找
如果不加./ 先从系统模块找,再从node_modules找 )
自定义的模块,统一放在node_modules中
3.如何发布自己的模块
创建一个新的文件夹,npm init
编写包的逻辑
npm publish,上传成功,npm --force unpublish (取消发布)
注意:引入自己的模块,路径加./
对外输出内容 ,必须加exports
js 可加可不加
六、express框架
简洁而灵活的 node.js Web应用框架
1.安装
npm install express --save
2.配置
3.接受请求 get/post/use
4.响应数据
非侵入式(增强式)
req req.url
res
原生 res.write()
express res.send() // 功能更多
优势:express 保留了原生的功能,添加了一些方法,增强原有的功能
使用三部曲:
1.创建服务 var server = express()
2.监听 server.listen()
3.处理请求 server.use('地址',function(req,res){})
处理请求三种方式:
get('/',function(req,res){})
post()
use() 融合两种请求
中间件 (使用、写、链式)
eg:express-static //设置静态文件路径
const static = require('express-static')
server.use(static('/'))
自己写
server.use(function(req,res,next(){
var str = ''
req.on('data',function(){
str += data
})
req.on('end',function(){
req.body = querystring.parse(str);
next()
})
}))
处理数据
GET 无需中间件
req.query
POST 需要 body-parser
server.use(bodyParser.unlencode({})) //用于处理 JSON, Raw, Text 和 URL 编码的数据
server.use(function(){
req.body
})
server.use(function(req,res,next(){
req.body
}))
链式操作
next() 下一个步骤
七、cookie
cookie
存在浏览器中 保存一些数据,每次请求都会带过来
不安全、有限(4K)
签名、加密
session
保存数据,保存在服务端
安全、足够大
不能独立存在、基于cookie实现的
cookie 中会有一个session的id、服务器利用session找到session文件、读取写入
隐患:session劫持
cookie
1、读取 cookie-parser
server.use(cookieParser("相同的签名 "))
server.use(function(){
req.cookies ==>未签名的cookie
req.signedCookies 签名
})
2、发送 response响应回去的
res.secret = ''
res.cookie('名字','值',{
path:'/aaa', // 向上继承
maxAge:30*24, // 毫秒
signed:ture // 是否签名 签名的密钥
})
3、删除
res.clearCookie('名字')
4、cookie-encrypter 加密
session
cookie-session
server.use(cookieParser())
server.use(cookieSession({
keys:['12','sss'],// 密钥
maxAge: 3600*1000, // 毫秒
}))
server.use('/',function(){
req.session
})
delete res.session
1、写入
2、读取
八、模板引擎 (渲染页面)
jade -破坏式、强依赖 不保持原来html
render('字符串)
renderFile('文件名',参数)
根据锁进,规定层级
属性放在(),逗号分隔
style = {}
class = []
内容 空格 依次
| 原样输出
. 所有的下一级 原样输出
include a.js
# {a+b } 输出内容
- var a = 5 / for
!标签正常输出
ejs -非侵入式 保留式
<%= name %>
<%= 12+5 %>
<%= 'fefefe' %>
<%= json.arr[0].name %>