后端渲染页面

渲染引擎:

  • jade / ejs / ….
  • arttemplate underscore baiduTemplate mustach …….
  1. 新建views文件
  2. 在views中写jade/ejs文件

jade中间件(模板引擎)

jade文件书写方式(如图 1-1)

  • 父子元素要缩进
  • 属性用括号
  • 样式 li(style={background:’red’,width:’200px’})
    图 1-1

jade API

let jade = require(‘jade’);//引擎

  1. let str = jade.reder(‘html’); //str为 <html></html>
  2. let str1 = jade.renderFile(‘jade模板’,{pretty:true});
    参数1:jade模板位置
    参数2:输出的html是有格式的

ejs中间件(模板引擎)

ejs API

let ejs = require(‘ejs’);

  1. ejs.render(str);
  2. ejs.renderFile(‘ejs模板’,{数据},(err,data)=>{});

ejs模板语法

ejs结构就是html
输出:<%= 数据名|变量名 %>
语句:<% for(){ %>..some code.. <% } %>
非转义输出:<%- 数据名|变量名 %>
引入模板:<% include 被引入的模板地址 %> //地址不需加引号


consolidate中间件

  1. 用途
    管理多个模板引擎

consolidate API

  1. 输出类型设置
    server.set(‘view.engine’,’[html/css/javascript]’);
  2. 模板引擎目录设置
    server.set(‘views’,’引擎模板目录’);
  3. 输出与引擎匹配
    server.engine(‘html’,consoleidate.ejs);
    server.engine(‘css’,consoleidate.jade);
  4. 渲染API
    server.use(‘/‘,(req,res,next)=>{
    res.render(‘模板文件(加后缀),{数据},(err,data)=>{});//参数3可
    })

express/multer/cookie-parser/cookie-session中间件

express

  1. express是啥
    是个nodejs库,基于npm上中间件。类似koa
  2. 特点
    二次封装,非侵入式,增强型
  3. 安装
    1. npm init -y
    2. npm install express -D
    3. 安装中间件
      npm i body-parser -D
  4. API
    • 引入模块
      let express = require(‘express’);
      let bodyParser = require(‘body-parser’);
    • 搭建服务器
      let server = express();
    • 监听
      server.listen(端口号)
    • 静态页面托管
      server.use(express.static(‘静态页面文件地址’));
    • 响应请求
      server.get/post/use(地址,(req,res)=>{res.send(string|buffer)});
      注:res.send(字符串/buffer)相当于res.write(string|buffer);res.end();
      若地址为/,则地址可省略
      • req.query获取get请求
        获取到的是object
      • 使用中间件获取post请求
        let bodyParser = require(‘body-parser’);//引入中间件(中间件是个函数)
        server.use(bodyParser()); //使用body-parser中间件
      • req.method
        判断是GET请求还是POST请求
      • next是个函数,调用下一个相同地址的响应,除了/(如图 3-1)
        图 3-1 body-parser next

中间件

body-parser

  1. body-parser API
    1. 搭建服务器
      let bodyParser = require(‘body-parser’); //引入body-parser中间件
    2. 获取post数据,限定大小,约定返回数据类xx.urlencoded({limit:xx}) //xx单位为kb
      server.use(bodyParser.urlencoded({limit:5*1024}));//使用body-parser组件将表单限制大小为5M
    3. 获取post数据
      req.body

multer

  1. node.js原生文件操作方法

    • 文件重命名
      fs.rename('当前文件','改后的文件名',(err)=>{});
    • 引入path模块(处理文件与目录的路径)

      • path.parse('c:\\wamp\\xx.png'); 磁盘路径(str -> obj)

        1
        2
        3
        4
        5
        6
        7
        8
        //path.parse之后得到的对象格式
        {
        root: 'c:\\', 盘符
        dir: 'c:\\wamp', 目录
        base: 'xx.png', 文件名
        ext: '.png', 扩展名
        name: 'xx' 文件,不含扩展名
        }
      • path.join(‘磁盘路径1’,’磁盘路径2’)
        参数1:__dirname 魔术变量 返回当前文件所在的磁盘路径

  2. 文件上传
    1. 前端
      file enctype="multipart/form-data"
    2. 后端
      • 使用body-parser中间件(不适合)
        body-parser 接受 urlencode编码数据 ,数据回来的是字符,所以body-parse不适合文件上传,采用multer
      • 使用multer中间件
        1. let multer = require(‘multer’); 引入
        2. let objMulter = multer({ dest: './upload' }); 实例化 返回 multer对象(将文件保存到服务器下的upload文件夹中)
          dest: 指定 保存位置(存到服务器)
        3. app.use(objMulter.any()); any 允许上传任何文件
        4. req.files获取到上传的文件数组(如图 2-1)
          • fieldname: 表单name名
          • originalname: 上传的文件名
          • encoding: 编码方式
          • mimetype: 文件类型
          • buffer: 文件本身
          • size:尺寸
          • destination: 保存路径
          • filename: 保存后的文件名 不含后缀
          • path: 保存磁盘路径+保存后的文件名 不含后缀
            图 2-1 req.files获取到的数组示例
  1. 如何识别同一个人访问了服务器(用户唯一性判断)
    http协议,http无状态
    • 原理:通过给客户端浏览器保存一些信息(服务器给浏览器写cookie)
    • 需要中间件cookie-parser cookie-session
    • 流程
      浏览器->服务器->给浏览器种cookie(服务器保留一份seesionID)->下次浏览器(带着cookie)->服务器(利用seesionID和cookie对比)->返回内容
    • cookie-paser
      let cookieParser = require(‘cookie-parser’);
      server.use(cookieParser());
      • res.cookie(key,value,{配置}) 给浏览器种cookie
      • req.cookie.key 返回cookie(服务器读cookie)
      • res.clearCookie(key) 服务器给浏览器删cookie
    • cookie-session
      let cookieSession = require(‘cookie-session);
      server.use(cookieSession({
      name:’key’,
      keys:[‘aa’,’bb’], //用来加密,为了安全,必须存在
      maxAge:1000*5 //过期时间}
      ));
      • 服务器写session
        req.session.key = value;
      • 服务器读session
        req.session.key
      • 服务器删session
        req.session.key = undefined;

nodejs-path模块

  1. 用途
    引入path模块(处理文件与目录的路径)

  2. path.parse('c:\\wamp\\xx.png'); 磁盘路径(str -> obj)

    //path.parse之后得到的对象格式
    {
        root: 'c:\\', 盘符
        dir: 'c:\\wamp', 目录
        base: 'xx.png',  文件名
        ext: '.png', 扩展名
        name: 'xx'     文件,不含扩展名
    }
    
  3. path.join('磁盘路径1','磁盘路径2'.....)
    path.join方法
  4. __dirname 魔术变量 返回当前文件所在的磁盘路径
  5. path.resolve([…paths])
    个人理解:从最右边参数到最左边参数依次拼接,直至有一个参数(string)的前面有/符号,否则一直拼接,如果处理完全部给定的 path 片段后还未生成一个绝对路径,则当前工作目录会被用上
    注:path.resolve()返回当前工作目录的绝对路径
    path.resolve从右往左开始拼接字符串,直至拼成一个绝对路径

ndoe.js

node.js官网链接
node.js中文网

node.js安装使用

  1. 环境:nodejs+web服务器+数据库
  2. 版本:Vx(主).x(子).x(修正)
    • 主版本:1/3API发生变化,使用方式变化
    • 子:API没有删减,使用方式没变化,内部实现发生变化
    • 修正版:什么都没变,处理一下bug
  3. 使用

    1. 编写
      IDE: webstrom hb
      编辑器:sublime
      命令行环境下,运行node命令行
    2. 运行
      命令行:dos命令行/linux命令行(git)/node命令行 node 文件名
      命令行环境下,输入node 回车

      注意:不支持dom/BOM ECMA支持
      需要nodejs提供:数据服务,文件服务,web服务

web服务器

web服务器:apache/ngnix/tomact
数据库服务器:sqlserver/mysql/mongoDB/oracle
后台管理:php/java/nodejs

  1. 流程

    • nodejs不渲染(大前端)
      用户-》地址栏(http[s]请求)-》web服务器(收到)-》nodejs处理请求(返回静态、动态)-》请求数据库服务(返回结果)-》nodejs(接收)-》返回前端渲染页面-》浏览器最终渲染
    • nodejs渲染(大后端)
      用户-》地址栏(http[s]请求)-》web服务器(收到)-》nodejs处理请求(返回静态、动态)-》请求数据库服务(返回结果)-》nodejs(接收)-》渲染页面-》浏览器(接收页面,完成最终渲染)
  2. nodejs手动搭建web服务器

    1. 引入http模块 require
    2. server/app =http.createServer

模块化

  1. 系统模块
    http/fs/querystring/url
  2. 元素
    • require引入模块、输入(后缀.js可不加)
      • 不指定路径
        先找系统模块,再找node_modules(依赖模块)
      • 指定路径
        指定./xx/模块名
        exports导出、输出
    • module模块
      • moudle.exports==exports
      • moudle.exports={
        自定义属性:值;
        }
  3. commonJS是node默认模块方式
    commonJS是个规范
    nodejs/webpack是实现
  4. 系统模块引入/自定义模块引入

    • require(‘’)//引入系统模块
      • 可在项目中添加node_modules文件夹
      • 在node_modulss中写入的模块在外面引入可以不加./
      • 权重:系统模块>node_modules>自定义模块
    • require(‘./….’)引入自定义模块
    • 对象简写
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      let a = 123;
      let b = abc;
      let c = function(){
      truea:a,
      trueb:b,
      truec:c
      true}
      //简写为
      let a = 123;
      let b = abc;
      let c = function(){
      truea,b,c
      true}
  5. nodejs支持ES6语法,但是不支持es6模块化管理,支持commonJS模块化管理

mysql

数据库

  1. 安装mysql两种方法(推荐第二种)
    1. 安装wamp 开启 mysql服务
    2. 安装mysql 开启服务
  2. 库操作
    • 客户顿
      1. wamp客户端是phpadmin
      2. mysql 客户端是navicat(收费)
    • 服务端
      1. wamp里面mysql(C:\wamp\mysql)
      2. mysql官网刚下载mysql(C:\Program Files\MySQL)

        mysql中间件

  3. 安装mysql中间件
    npm i mysql -D
  4. 连接数据库(推荐方法2)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    //方法一:
    let mysql = require('mysql');
    let db = mysql.createConnection({
    truehost:'localhost',//主机名
    trueuser:'root',//mysql账号
    truepassword:'123456',//mysql密码
    truedatabase:'test'//mysql数据库
    });
    db.connect();//连接数据库
    let str = 'select * from user';
    let str1 = 'insert into user values(default,"tbl",123)';
    //执行sql语句
    db.query(str1,(err,data)=>{
    trueconsole.log(err);
    trueconsole.log(data);
    })
    //方法2
    //创建库连接池
    let mysql = require('mysql');
    let db=mysql.createPool({
    host:'localhost',
    user:'root',
    password:'root123',
    database:'2017-8-29',
    port:3306
    });
    let str = 'select * from user';
    let str1 = 'insert into user values(default,"tbl",123)';
    //执行sql语句
    db.query(str1,(err,data)=>{
    trueconsole.log(err);
    trueconsole.log(data);
    })
  5. mysql中间件API

    1. 执行sql语句
      db.query(sql语句,回调(err,data));
      • err 返回错误信息
      • data 数据库数据(array)

mysql语句

增:
    INSERT INTO 表(字段列表) VALUES (值列表)
    INSERT INTO user(ID,username,password) VALUES(0,"ppp","ppp123")
删:
    DELETE FROM 表 WHERE 字段名=值
    DELETE FROM user WHERE username="ppp"
改:
    UPDATE 表 SET 字段名=值 WHERE 字段名=值
    UPDATE user SET username="uncle9" WHERE username="alex"
查:
    SELECT ? FROM 表
    ?    ==    字段名    /     字段1,字段2    / *
    SELECT * FROM user
    SELECT username,password FROM user

npm

npm简写

初始 简写 含义
install i 安装
–save -S 项目依赖
–save-dev -D 开发依赖

npm

  1. 类似 bower yarn
  2. 用途
    安装模块,自动安装依赖,管理包(增、删、更新项目所有包)
  3. 安装环境
    1. 全局
      任何目录、项目环境下都可以使用
      • 工具类,脚手架
    2. 本地
      只能在当前目录使用
    3. 项目依赖(dependencies)
      只能在当前项目下使用
      • 上线仍需要
    4. 开发依赖(devDependencies)
      只能在当前项目下使用
      • 上线不需要
  4. npm指令
    • npm install/uninstall 包名 -g //安装、卸载到全局
    • npm install/uninstall 包名 //安装、卸载到本地
    • npm imstall 包名1 包名2 //一次安装多个包
    • 查看已安装
      • npm list //查看当前项目下安装的所有包
      • npm outdated //包版本对比(当前版本)
      • npm info 包名 //查看当前包所有信息
    • npm init //创建package.json(初始化npm管理文件)
      npm init -y //所有默认
    • 安装到项目依赖
      • npm install 包名 –save
      • npm install 包名 -S
    • 安装到开发依赖
      • npm install 包名 –save-dev
      • npm install 包名 -D
    • 版本约束
      • ^x.x.x 约束主版本,后续找更新
      • ~x.x.x 保持前两位不变,后续找更新
      • *转最新
      • x.x.x 定死版本
    • 选择源
      • npm install nrm -g //安装选择源的工具包
      • nrm ls //查看所有源
      • nrm test //测试所有源
      • nrm use 源名 //使用。。源
    • 模块下载(卡顿)超过五分钟
      ctrl+c->npm unistall 包名->npm cache clean清除缓存->npm install 包名
    • 查看帮助信息
      npm -h
    • 发布模块
      1. 注册账号
      2. 登录
        npm login
      3. 创建包目录->npm init -y ->创建入口->编写、输出
      4. npm publish 发布
      5. npm unpublish 删除
        注:发布操作长时间没做,需到邮箱中确认

mongoDB

  1. 数据库,nosql(非关系型)
  2. 场景
    解决大规模数据集合多重数据种类
  3. 新建data/db文件夹
    在c盘下新建data文件夹,再在data文件夹中新建db文件夹
  4. 在下面文件夹中启动命令行
    C:\Program Files\MongoDB\Server\3.4\bin
  5. 指定数据存储目录(每次都需要指定)
    命令行输入 mongod --dbpath c:\data\db
  6. 开启服务
    命令行输入mongod
  7. 配置环境变量,使mongod可以在任何地方运行
  8. 开启客户端
    命令行输入 mongo
    注意:此命令行必须另外开启一个,mongod命令行是一直开启的(为了保障mongoDB服务开启)

mongoDB

  1. msyql和mongoDB区分
mysql mongoDb
database(库) database(库)
table(表) collection(集合)
row(一条数据) document(文档)
column(字段) field(区域)
用mysql中间件 用mongodb中间件
返回数组 返回对象,需要toArr
  1. 存储方式:
    mysql 二维表
    MongoDB json

  2. 库操作:


    • show dbs
    • 查看当前库
      db

    • use 库名 //没有建,有就切换

    • db.dropDatabase() 删除当前库
  3. 集合(表)操作:

    • db.createCollection('表名',{配置})
      配置:{size:文件大小,capped:true,max:条数|文档数} capped定量
      

    • show collections / db.getCollectionNames()

    • db.表|集合.drop()
  4. 文档(row)操作:
    • 增:
      db.集合.save({}) / db.集合.insert({})  添加一条
      db.集合.save([{},{}]) / db.集合.insert([{},{}])
      insert  不会替换相同ID    save会
      
    • 删:
      db.集合.deleteOne({}) db.集合.remove({},true)  一条
      db.集合.remove({要删数据描述}) 多条
      db.集合.remove({}) 清空表
      
    • 改:
      db.集合.udpate({要替换的数据},{替换后的},bl插入,bl替换)
      替换后的:
          {\$set:{数据},$inc:{age:1}}
      
    • 查:
      所有:db.集合.find(条件)
      条数: db.集合.find().count()
      去重:db.集合.distinct(key)
      
      • 条件
        {age:22}        age == 22
        {age:{\$gt:22}}    age > 22
        {age:{\$lt:22}}    age < 22
        {age:{\$gte:22}}    age>=22
        {age:{\$lte:22}}    age<=22
        {age:[{\$lte:122},\{\$gte:22}]}age<=122 && age>=22
        {$or:[{age:22},{age:122}]}    22 or 122
        
      • 限定 (只显示number条)
        db.集合.find().limit(number)
      • 跳过
        db.集合.find().skip(number)
      • 查一条
        db.集合.findOne()/db.集合.find.limit(1)
      • 排序
        db.集合.find().sort({key:1/-1}) //1升序,-1降序
      • db.集合.find({条件},{指定要显示列区域})
        指定要显示列区域: 区域名username:1 显示着个区域,其他不显示
        指定要显示列区域: 区域名username:0 不显示着个区域,其他显示
        _id 是默认显示
        
      • 实例
        db.集合.find({条件},{指定显示区域}).skip(10).limit(10).sort({key:1})

nodejs + mongodb中间件

  1. require(‘mongodb’); 引入模块
  2. 创建客户端 mongoCt = mongodb.MongoClient
  3. 链接库 mongoCt.connect(‘协议://地址:端口/库名’,回调(err,db))
  4. 链接集合(表) user = db.collection(‘集合名’);
  5. user.API() 表操作 返回 对象
    user.API().toArray((err,result)=>{reulst==arr})
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    let mongodb = require('mongodb');
    let mongoCt = mongodb.MongoClient;//创建客户端
    mongonCt.connect('mongodb://127.0.0.1:27017/库名'),(err,db)=>{
    true//链接集合
    truelet user = db.collection('user');
    true//集合操作
    trueuser.insertOne({},(err,result)=>{
    truetrueif(err){
    truetruetruethrow new Error();
    truetrue}else{
    truetruetrue...
    truetruetruedb.close();//关闭库
    truetrue}
    true});
    }

脚手架

nodejs+express+脚手架+mongodb

  1. 用途
    自动搭建项目环境,无需手动
  2. 脚手架需要安装到全局
    npm install express -g
    npm install express-generator -g
    在需要初始化的文件夹中express
    npm i
  3. 使用
    命令行:脚手架名称 目录

supervisor中间件

  1. 用途
    改动服务代码,自动重启服务
    npm install supervisor -g
  2. 通过运行supervisor启动服务(监听代码改动)
    supervisor ./bin/www
|