前言
关于智能社nodejs的学习笔记
http模块
// 引入
const http = require('http')
// 创建
let server = http.createServer((req,res) => {
res.write('abc')
// 若无数据返回
res.end()
});
// 监听端口
server.listen(8080)
fs文件模块
const fs = require('fs')
// 读文件
fs.readFile(fileName, (err,data) => {})
// 写文件
fs.writeFile(fileName,content,err => {})
http数据解析
get
解析url中的query,有三种方法:
- split手动切割(麻烦)
- query Strings模块,解析形如a=1&b=2的url
- url模块,解析形如aaa?a=1&b=2的url
Query Strings模块
const queryString = require('querystring');
// req.url -> index.html?user=xiaoming&age=12
// 如果存在query
if(req.url.indexOf('?') != -1) {
let arr = req.url.split('?');
let url = arr[0];
// 获取query进行parse
GET = queryString.parse(arr[1]); // {'user': 'xiaoming','age': '12'}
} else {
let url = req.url;
}
url模块
const urlLib = require('url');
// parse(完整url,true) 第二个参数为true时解析query为JSON对象
let queryObj = urlLib.parse(req.url, true);
// 请求路径pathname
let url = queryObj.pathname
// 请求序列query
let GET = queryObj.query
post
// 比如接收一大段文本
let str = ''
// data 有一段数据到达
req.on('data',data => {
str += data
})
// end 数据全部到到达
req.on('end',() => {
// 请求序列
let POST = queryString.parse(str)
})
模块
系统模块
- Assert 断言
- Crypto 加密
- Events 事件
- Net 网络
- OS 操作系统
- Path 文件: parse(path) -> base、ext、dir、name
- Stream 流操作
- Timers 定时器
- ZLIB 压缩
封装模块
// require 引入
const fs = require('fs')
// module.exports 导出
module.exports.name = "zhangyingji"
module.exports.sayName = function() {console.log("666")}
module.exports = {
name: 'zhangyingji'
sayName: function() {console.log("666")}
}
// exports 导出
exports.a = 2019
包管理器
发包
npm login
// 配置初始化信息
npm init
// 发布
npm publish
// 更新包
npm update
// 删包
npm unpublish
express
初始化
npm install express
const express = require('express')
let server = express()
server.listen(8080)
处理请求
- get(‘/’,(req,res) => {})
- post(‘/’,(req,res) => {}) 需要body-parser解析
- use(‘/’,(req,res[,next]) => {})
/**
* get
* /login?user=xxx&pass=xxx
*/
server.get('/login', (req,res) => {
let user = req.query['user']
let pass = req.query['pass']
// 判断数据库是否存在user,再判断密码...
})
中间件
- body-parser 解析post数据 enctype=”application/x-www-form-urlencoded”
- consolidate 模板引擎整合
// 使用这个中间件则不用引入其他模板
const consolidate = require('consolidate')
// 设置渲染html
server.set('view engine', 'html')
// 指定模板位置
server.set('views', 'path')
// 指定模板引擎
server.engine('html', consolidate.ejs)
// 接收请求
server.get('/index', (req,res) => {
res.render("1.ejs", {name: 'yingji'})
})
- cookie-encrypter 加密cookie
- cookie-parser 解析cookie
- cookie-session
- express-static 在制定dir加载静态数据
- multer 文件上传 enctype=”multipart/form-data”
const multer = require('multer')
const pathLib = require('path')
const fs = require('fs')
// dest: 保存位置
let objMulter = multer({dest: "path"})
server.use(objMulter.any())
// 加扩展名
server.post('path', (req,res) => {
let newName = req.files[0].path + pathLib.parse(req.files[0].originalname).ext
})
// 重命名
fs.rename(req.files[0].path, newName, (err) => {})
- ejs
- pug
const expressStatic = require('express-static')
server.use(expressStatic('./www'))
自定义中间件
链式操作:next()
// 自定义body-parser
const queryString = require('querystring')
module.exports = {
urlencoded: () => {
return (req,res,next) => {
let str = ''
req.on('data',data => {
str += data
})
req.on('end',() => {
req.body = queryString.parse(str)
// 链式操作
next()
})
}
}
})
// 以上相当于
// server.use(bodyParser.urlencoded({extended: false}))
cookie、session
cookie
写入
server.use('/', (req, res) => {
/**
* res.secret = 'signKey'
* res.cookie('key','value',{path:'',maxAge:time[,signed:true])
*/
res.cookie('user', 'zhangyingji', {
path: '/',
maxAge: 30 * 24 * 3600 * 1000 // 有效期ms
})
res.send('ok')
})
读取 需要用到:cookie-parser
// server.use(cookieParser('signKey')) 设置了res.secret = 'signKey'
server.use(cookieParse())
// req.cookies['key'] => 未签名cookie
// req.signedCookies['key'] => 已签名cookie
删除
res.clearCookie('key')
session
需要用到:cookie-parser、cookie-session
写入
let keyArr = []
for(let i=0; i<10000; i++) {
keyArr.push('sig_' + Math.random())
}
// 需要先解析
server.use(cookieParser())
server.use(cookieSession(){
name: 'session',
keys = keyArr, // 强制需要一个key数组
maxAge: 20*3600*1000
})
读取和删除
server.use('/',(req,res) => {
req.session['key']
})
delete req.session['key']
模板引擎
pug
- 破坏式、侵入式、强依赖
- 按缩进规定层级
- 属性在括号中,多属性用逗号分隔
-
同行原样输出;- 标记为代码;.下级原样输出 - include
- 变量 #{},等价于=,!=不对标签转义,可做运算
- -for、-if
- switch case -> case when
书写
html
head
script.
window.onload = function() {
let str = ''
}
include test.js
body
a(href="blog.zhangyingji.top") #{name}的博客
div(class=class1 class="active")
footer
const pug = require('pug')
let str = pug.renderFile('path', {
name: '张荧集',
class1: {}
})
fs.write('filePath', str, (err,data) => {})
ejs
- 温和、非侵入式、弱依赖
- -代码
- include
<%= name %>
<%= json.arr[0].name %>
<%= 12+5 %>
<%= 'asdfasdf' %>