node基礎知識點


title: node基礎知識點 time: 2019-8-15

node基礎知識點

[toc]javascript

1.node中的部分變量

1.1 global 全局變量

在node中有一個全局變量,globar,裏面掛載了不少的方法,在使用的時候不須要加前綴,即可直接使用css

例如:html

  • __dirname:獲取目錄的名字
  • __filename: 獲取文件的名字

2. koa框架的使用

Koa 是一個新的 web 框架。 經過利用async函數,Koa 幫你丟棄回調函數,並有力地加強錯誤處理。 Koa 並無捆綁任何中間件, 而是提供了一套優雅的方法,幫助您快速而愉快地編寫服務端應用程序。前端

koa中主要是中間件:洋蔥模型 原理:dispatchcomposejava

koa腳手架的安裝流程node

  • 1 安裝koa-generator

$ npm install -g koa-generatorgit

  • 2 使用koa-generator生成koa2項目

$ koa2 -e project(項目名稱) (-e 表明使用模板引擎ejs | -a 表明art模板 )es6

參考文檔web

2.1 koa開闢一個簡單的服務

安裝redis

npm i koa

建立一個服務

enter description here

2.2 koa-router 路由

安裝

npm i koa-router

配置

let router = require("koa-router")(); //引入router並進行實例化

//啓動路由 app.use(router.routes()); app.use(router.allowedMethods());

示例

enter description here

2.3 koa-promise 合併中間件

安裝

npm install koa-compose

做用

多箇中間件合併成單一中間件,方便重用和導出

示例

enter description here

2.4 koa-bodyparser 接收post提交的數據

安裝

npm i koa-bodyparser

配置

//配置Post提交數據的中間件 app.use(bodyparser());

或者可指定配置低的類型

app.use ( bodyparser ({ enableTypes: [ 'json' , 'form' , 'text' ] }) );

示例

enter description here

2.5 koa-static 託管靜態資源

安裝

npm i koa-static

配置

//託管靜態資源 app.use(static(__dirname+"/public"));

示例

enter description here

2.6 koa-view 載html模板文件列入art

通常狀況下:koa2----art模板 | express---ejs模板

安裝

npm i koa-views

配置

app.use( views( __dirname + '/views', { extension: 'art' //模板後綴,能夠是 art、ejs、html.... }));

示例

enter description here

2.7 koa-art-template 模板引擎

安裝

npm i koa-art-template

配置

//配置模板引擎 render(app, { root: path.join(__dirname, 'views'), //模板引擎的存放的位置 extname: '.art', //模板的後綴 //判斷當前環境,若爲開發環境有debug,反之再也不有debug模塊 debug: process.env.NODE_ENV !`` 'production' });

示例

enter description here

2.8 silly-datetime 格式化時間

安裝

npm i silly-datetime

配置

return sd.format(time,"YYYY-MM-DD HH:mm:ss");

模板中的簡單使用

let sd = require("silly-datetime"); <td> time | dateFormat </td> dateFormat(value)=>{return sd.format(time,"YYYY-MM-DD HH:mm:ss")}

2.9 path 處理路徑問題

path 模塊是 node 提供的,用於處理文件路徑和目錄路徑的實用工具

安裝

npm i path

經常使用的幾個方法:

  1. path.extname(name)
    • 返回 name 的擴展名
    • 例如:.html
  2. path.join()
    • 將全部給定的 path 片斷鏈接在一塊兒,而後規範化生成的路徑。
    • path.join('/foo', 'bar', 'baz/asdf', 'quux', '..'); // 返回: '/foo/bar/baz/asdf'
  3. path.parse(path)
    • 法返回一個對象,其屬性表示 path 的重要元素

    • 返回的對象將具備如下屬性:

      • dir <string>
      • root <string>
      • base <string>
      • name <string>
      • ext <string>
    • 示例:

path.parse('/home/user/dir/file.txt');

// 	返回:
//       {  root: '/',
//          dir: '/home/user/dir',
//          base: 'file.txt',
//          ext: '.txt',
//          name: 'file'   }
複製代碼

2.10 koa-session 會話,保存內容信息

session是一種記錄客戶狀態的機制,一般是保存在服務端,經常用來做爲用戶鑑權的機制。

安裝

npm i koa-session --save

配置

enter description here

使用

設置值: ctx.session.username = "張三"; 獲取值: ctx.session.username

源碼

let app = require("koa")();//實例化一個koa
let session = require("koa-session"); //session的操做

//配置session中間件
app.keys = ["some secret hurr"];
let CONFIG = {
    key: 'koa:sess',    //cookie key (default is koa:sess)
    maxAge: 86400000,   // cookie的有效期,默認一天
    overwrite: true,    //是否能夠overwrite (默認default true)
    httpOnly: true,     //cookie是否只有服務器端能夠訪問,默認true
    signed: true,       //簽名默認true
    rolling: false,     //在每次請求時強行設置cookie,這將重置cookie過時時間(默認:false)
    renew: false,       //(boolean) renew session when session is nearly expired,
};

//使用session中間插件
app.use(session(CONFIG,app));

app.listen(3000);
複製代碼

2.11 koa2-ueditor 百度富文本編輯器

安裝

npm i koa2-ueditor

引入使用

const ueditor = require("koa2-ueditor")

配置富文本編輯器 主要是配置圖片的保存位置與保存格式

router.all('/editor/controller', ueditor(['public', {
                "imageAllowFiles": [".png", ".jpg", ".jpeg"],
                "imagePathFormat": "/upload/ueditor/image/{yyyy}{mm}{dd}/{filename}"  // 保存爲原文件名
            }]))
複製代碼

引入ueditor靜態文件資源

將官網中的public資源 所有複製到本身的項目中

enter description here
而後在使用富文本編輯器的地方引入項目的文件

<script type="text/javascript" charset="utf-8" src="/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="/ueditor/ueditor.all.min.js"> </script>
<script type="text/javascript" charset="utf-8" src="/ueditor/lang/zh-cn/zh-cn.js"></script>
複製代碼

配置富文本編輯器的ueditor.config.js文件

  1. 配置服務器統一接口位置

路徑即爲項目中配置富文本編輯器對的位置

enter description here
enter description here

  1. 配置富文本編輯器的導航欄

富文本編輯器爲咱們提供了很複雜的一套導航欄,咱們能夠根據須要,自行配置

//自定義工具類功能按鈕與下拉按鈕
        ,toolbars: [["fullscreen","source","undo","redo","insertunorderedlist","insertorderedlist","link","unlink","help","attachment","simpleupload","insertimage","emotion","pagebreak","date","bold","italic","fontborder","strikethrough","underline","forecolor","justifyleft","justifycenter","justifyright","justifyjustify","paragraph","rowspacingbottom","rowspacingtop","lineheight","insertcode"]]
複製代碼
  1. 配置文本編輯器是否跟隨內容增高

enter description here

使用富文本編輯器

把以前的textarea使用script標籤代替 <script id="editor" type="text/plain" style="width:600px;height:300px;"></script>

<script> //實例化editor富文本編輯器 var ue = UE.getEditor('editor'); //設置富文本編輯器裏面的內容 //當須要往裏面填充內容的時候使用 ue.addListener("ready",function(){ ue.setContent(`我是一隻小小鳥`) }) </script>
複製代碼

2.12 koa-multer 上傳文件

安裝

npm i koa-multer

配置

enter description here

使用方式

  • 指定form表單的提交頭
    enter description here
  • 獲取上傳的文件
    enter description here

源碼

let multer = require("koa-multer"); //文件上傳

//配置文件上
let storage = multer.diskStorage({
    //文件保存路徑
    destination: function(req,file,cb){
        cb(null,'public/uploads');
    },

    //修改文件名稱
    filename:function(req,file,cb){
        //以點進行分割成數組,數組的最後一項就是後綴名
        let fileFormat = (file.originalname).split("."); 
        
        //對文件重新進行命名 時間加文件後綴 
        cb(null, Date.now() + "." + fileFormat[fileFormat.length - 1]);   
    }
});

//加載文件上傳配置
let upload = multer({storage:storage});
複製代碼

當上傳圖片的時候,實現圖片的預覽功能

enter description here

源碼

<form action="/doAdd" method="post" enctype="multipart/form-data" >

    <input type="file" onchange="uploadImg(this)" name="img_url" />
    <img src="" id="viewImg">

</form>

<!-- 實時顯示上傳的圖片 -->
<script> function uploadImg(fileDom) { // 獲取圖片數據對象 let file = fileDom.files[0]; let reader = new FileReader(); reader.readAsDataURL(file); //確保文件成功獲取,base64數據量比較大 reader.onload = function (event) { let e = event || window.event; //獲取到img標籤 let img = document.getElementById("viewImg"); //設置img標籤的路徑 img.src = e.target.result; } } </script>
複製代碼

2.13 分頁組件的使用

參考文件 enter description here

引入文件

引入jqpaginator.js文件

前端的使用

enter description here

使用art模板渲染時傳值

enter description here

操做monage數據庫操做

enter description here

3. express 框架的使用

Express 基於 Node.js 平臺,快速、開放、極簡的 web 開發框架

全局安裝生成器

npm install -g express-generator

建立應用

express 項目名 express myDemo

參考文檔

3.1 mongoose數據庫的使用

安裝

npm i mongoose

配置

useUnifiedTopology: true 解決以下錯誤

enter description here

useNewUrlParser:true 解決以下警告

enter description here

示例

enter description here

3.2 body-parser 獲取表單提交的數據

安裝

npm i body-parser

使用

const bodyParser = require('body-parser');

  • (1)處理json數據

    • bodyParser.json(options)

    • app.use(bodyParser.json());

  • (2)處理Buffer數據流,解析二進制格式

    • bodyParser.raw(options)

  • (3)處理文本數據,解析文本格式

    • bodyParser.text(options)

  • (4)處理UTF-8的編碼的數據,解析文本格

    • bodyParser.urlencoded(options)

    • app.use(bodyParser.urlencoded({extented:false}))

示例

enter description here

3.3 express-session 會話的使用

安裝

npm i express-session

配置

enter description here

session()的參數options配置項主要有:

  • name: 設置cookie中,保存session的字段名稱,默認爲connect.sid
  • store: session的存儲方式,默認爲存放在內存中,咱們能夠自定義redis等
  • genid: 生成一個新的session_id時,默認爲使用uid2這個npm包
  • rolling: 每一個請求都從新設置一個cookie,默認爲false
  • resave: 即便session沒有被修改,也保存session值,默認爲true
  • saveUninitialized:強制未初始化的session保存到數據庫
  • secret: 經過設置的secret字符串,來計算hash值並放在cookie中,使產生的signedCookie防篡改
  • cookie : 設置存放sessionid的cookie的相關選項

3.4 託管靜態資源

// 提交靜態資源 app.use(express.static('public'))

3.5 服務器端配置跨域問題

enter description here

源碼

let express = require('express');
let app = express();

// 在後端配置,讓全部的人均可以訪問個人api接口
app.use('*', function (req, res, next) {
    // 容許哪些客戶端來訪問我
    res.setHeader("Access-Control-Allow-Origin","*");
    // 容許能夠添加哪些頭,而後來訪問我
    res.setHeader("Access-Control-Allow-Headers","*");
    // res.header('Access-Control-Allow-Headers', 'Content-Type,Authorization');
    
    // 容許哪些方法來訪問我
    res.setHeader("Access-Control-Allow-Methods","OPTIONS,PUT,DELETE");
    // res.header('Access-Control-Allow-Methods', '*');
    
    // 能夠每隔半小時,來發送一個options請求--試探請求
    res.setHeader("Access-Control-Max-Age","1800");
    
    // 請求的類型編碼
    res.header('Content-Type', 'application/json;charset=utf-8');
    
    // 容許客戶端攜帶憑證,處理cookie信息,若是有,而且不對每次請求都新開一個session
    res.setHeader("Access-Control-Allow-Credentials",true);
    next();
});
複製代碼

3.6 jsonwebtoken 生成token

安裝

npm i jsonwebtoken

引入

const jwt = require('jsonwebtoken');//引入生成token的包

使用

enter description here

示例

enter description here

源碼

jwt.sign(arr, keys.secretOrkey, { expiresIn: 3600 }, (err, token) => {
    if (err) throw err;
    res.json({
        code: 1,
        token: "Bearer " + token     //生成格式 Bearer + token
    })
});
複製代碼

3.7 bcrypt密碼加密

安裝

npm i bcrypt

引入

const bcrypt = require('bcrypt')//引入加密的包

密碼加密

enter description here

密碼解密

enter description here

完整示例

enter description here

源碼

const Mpage = require("../../model/Mpage.js");
const express = require("express");
const router = express.Router();
const jwt = require('jsonwebtoken');//引入生成token的包
const bcrypt = require('bcrypt')//引入加密的包
const keys = require("../../config/keys")//引入密鑰


//註冊接口
router.post("/register", (req, res) => {
    Mpage.findOne({ email: req.body.email }).then(user => {
        if (user) {
            return res.status(400).json("郵箱已經被註冊")
        } else {
            const newUser = new Mpage({
                name: req.body.name,
                email: req.body.email,
                password: req.body.password
            });
            //生成salt的迭代次數
            const saltRounds = 10;
            
            //生成salt並獲取hash值
            bcrypt.genSalt(saltRounds, function (err, salt) {
                bcrypt.hash(newUser.password, salt, function (err, hash) {
                    if (err) console.log(err);
                    newUser.password = hash;
                    newUser.save().then(user => res.json(
                            res.json({code: 1,msg: '註冊成功'})
                    )).catch(err => res.json(err))
                })
            })
        }
    })
})

//登陸接口
router.post("/login", (req, res) => {
    const email = req.body.email;
    const password = req.body.password;
    Mpage.findOne({ email }).then(user => {
        if (!user) { return res.status(404).json("用戶名不存在") }
        //密碼解密比對
        bcrypt.compare(password, user.password).then(isMatch => {
            if (isMatch) {
                const userArr = {
                    id: user.id,
                    name: user.name,
                    email: user.email
                };
                //生成token
                jwt.sign(userArr, keys.secretOrkey, { expiresIn: 3600 }, (err, token) => {
                    if (err) throw err;
                    res.json({
                        code: 1,
                        token: "Bearer " + token
                    })
                })
            } else {
                return res.status(400).json("密碼錯誤")
            }
        })
    })
})
複製代碼

3.8 passport 驗證token

安裝

npm i passport

引用

const passport = require('passport');

配置

  • app.use(passport.initialize()); // 初始化passport
  • require("./config/passport")(passport); //導入配置文件

passport配置文件

enter description here

權限校驗

enter description here

源碼

  1. 配置
// 配置passprot
app.use(passport.initialize());  // 初始化passport 
require("./config/passport")(passport); //導入配置文件
複製代碼
  1. 配置文件
// 專門用來配置Passport 驗證jwt 配置的話,搜索passport-jwt
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const keys = require('../config/keys');
const mongoose = require('mongoose');
const User = mongoose.model('User');    //把User的model導入

let opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = keys.secretOrkey;    //祕鑰,必須與生成token時的祕鑰一直

//參數爲在主函數中傳遞過來的
module.exports = passport => {
    //進行token權限的校驗,將token中的信息解析,放在jwt_payload中
    passport.use(new JwtStrategy(opts, function (jwt_payload, done) {
        //從數據庫裏找該用戶的信息,並返回
        User.findById(jwt_payload.id).then(user => {
            if (user) {
                return done(null, user) //返回用戶信息
            }
            return done(null, false)
        }).catch(err => console.log(err))
    }));
}
複製代碼
  1. 使用
router.get("/find/:id", passport.authenticate("jwt", { session: false }), (req, res) => {
    //獲取生成token的用戶信息
    let tokenData = req.user;
    
    User.findOne({ _id: req.params.id }).then(information => {
        if (!information) {
            return res.status(404).json('沒有查到該用戶信息')
        }
        res.json(information)
    })
})
複製代碼

3.9 分頁,排序,模糊查詢

enter description here

源碼

// 獲取全部的新聞數據,
// 分頁,排序,模糊查詢,

router.get("/list",passport.authenticate("jwt", { session: false }),(req,res)=>{
    
    //獲取要查詢的內容
    let attr = req.query.title;
    //獲取當前頁,默認第一頁
    let currentPage = parseInt(req.query.currentPage ) || 1;
    //獲取每頁的大小,默認每頁五條數據
    let pageSize = parseInt(req.query.pageSize)|| 5;
    //分頁時,每次截取的數量,1-5 6-10
    let slipNum=(currentPage-1)*pageSize;
    //排序的字段,按照那個字段進行排序
    let sort_attr = req.query.sort_attr || "";
    //排序的規則,正序,倒序,默認正序
    let sort_value = req.query.sort_value || -1;
    
    //判斷查詢的數據是否存在
    let attrs = {};
    if(attr){
        //根據查詢數據,設置模糊查詢
        attrs.title = new RegExp(attr)
    }
    
    //判斷排序規則是否存在,
    let sort = {};
    if(sort_attr){
        sort = {[sort_attr]:sort_value};
    }
    
    //根據上述條件獲取到信息列表
    news.find(attrs).skip(slipNum).limit(pageSize).sort(sort).then(newss=>{
        if(!newss){
            return res.status(404).json("沒有任何內容")
        }
        //根據條件獲取信息列表的總條數
        news.count(attrs).then((data) => {
            res.json({  //返回信息列表與當前的總頁數
                count:data,
                news:newss
            })
        })
    })
})
複製代碼

4. mongoDB數據庫的簡單使用

5. mongoose的使用步驟

安裝

npm i mongoose

步驟:

  • 1,安裝並引入 const mongoose = require("mongoose")
  • 2,創建鏈接 mongoose.connect("mongodb://127.0.0.1/myapp") 若是在數據庫沒有myapp這個數據庫,鏈接時,並不會自動建立這個數據庫 ,使用 useNewUrlParser來解決mongoose中的警告問題 mongoose.connect('mongodb://127.0.0.1:27017/djdb', { useNewUrlParser: true }).then()
  • 3,定義一個Schema,它須要和你最終在數據庫中建立的字段保持同樣 Schema建立完後,也不會在數據庫自動建立這個數據庫
  • 4,根據Schema建立model
  • 5,實例化model
  • 6,經過save保存數據到數據庫

enter description here

6. babel E6->E5

安裝babel

npm i @babel/cli npm i @babel/core npm i @babel/preset-env

配置輸出位置 packjson文件

enter description here

配置 .babelrc文件

enter description here

注意

@babel/cli  解析core
@babel/core   核心碼
@babel/preset-env 將es6--->es5
複製代碼
相關文章
相關標籤/搜索