nodejs

学习笔记

Posted by zhangyingji on March 18, 2019

前言

关于智能社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(fileNamecontenterr => {})

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

扩展:module.exports和exports的区别

包管理器

发包

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

写入

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' %>