node 學習筆記 基礎入門

XiaoYi_Holle發表於2020-10-13

網址

  1. 官網

    • https://nodejs.org
  2. 中文文件

    • http://www.nodeclass.com/api/node.html

nodejs

什麼是nodejs:

是構建在 Chromes V8 引擎上 js 的執行環境,可以解析javaScript 程式碼。

​ javaScript 可以脫離瀏覽器執行,歸功於node.js

​ 事件驅動,非阻塞I/O 模型 (非同步)

​ nodejs npm 是世界上最大的開源生態系統 javaScript 絕大多數包存放在npm 上

  • Node.js可以做什麼

    沒有 BOM DOM

    ​ 就是沒有window 和 document

    web 伺服器後臺

    命令列工具

    ​ npm (node)

    ​ hexo (node)

    ​ git (c)

  • B/S 程式設計模型

    Browser - Server

    任何伺服器端技術都是BS程式設計模型都是一樣,和語言無關、

    Node 只是作為我們學習BS的工具而已

  • 模組化程式設計

    RequireJS

    SeaJS

  • Node常用的API

  • 非同步程式設計

    回撥函式

    Promise

    async

    generator

  • Ecmascript 6

  • 瀏覽器中的javaScript 沒有檔案操作=能力的e

  • 在node 中 的JavaScript具有檔案操作能力的

  • 新建一個domo
  • npm init -y
  • npm i mongoose

npm

  1. 建立node_mudules 檔案

    npm init -y
    

設定預設 node_moduo路徑

  1. 檢視當親路徑

    npm config get prefix
    
  2. 設定默路徑

    C:\Users\小毅\AppData\Roaming\npm
    

新建專案

  1. npm init -y
  2. npm install express
  3. node app.js

檔案操作

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-4Fltij3b-1602604164981)(D:\2020\NoBook\img\image-20200518222600778.png)]

  1. 檔案操作路徑

    //在檔案操作中的相對路徑
     ./data/a.txt    相對於當前目錄
     data/a.txt		 相對於當前目錄
     /data/a.txt	 絕對路勁,當前檔案模組所處的磁碟根目錄
     c:/xx/xxx...	 絕對路徑
    
  2. 模組操作路徑

    // 相對路徑
    require('./data/app.js')
      
    // 如果忽略了 .   則是磁碟根目錄
    require('/data/app.js')
    
  3. 利用 require 方法引入 fs 核心模組

    var fs = require('fs')
    
  4. 檔案的讀取

    fs.readFile('hello.txt',function(error,data){
    
    	if(error){
    
    		console.log(data);
    
    		console.log(data.toString());	
            
    	}
    
  5. 檔案的性質

    //檔案是以 二進位制資料儲存的
    
    fs.readFile 讀取出來的資料是16進位制
    
    //可以通過toString()方法轉化我們我熟悉的漢字
    
  6. 檔案的寫入

    // 利用fs.writeFile()方法在檔案寫入資料
    fs.writeFile('./hello.txt',data,function(error){if(error){
    
    ​		console.log('檔案寫入失敗');}else{
    
    ​		console.log("檔案寫入成功");}
    

檔案讀取 FIleReader

  1. javascript 內建函式

    var reader = new FileReader();
    reader.readASDataURL('檔案');
    reader.onload = function(){
        console.log(reader.result);
    }
    

http 服務

  1. 案例
/*
 * 載入http核心模組

   var http =require('http');

 * 建立一個Server例項

   var server = http.createServer();

*    建立一個request 請求事件

*/

//載入http 核心模組
var http = require('http');

//建立一個Server 例項
 var server  = http.createServer();

//註冊request 請求事件
//當客戶端請求過來,就會自動觸發伺服器的request 請求事件,然後執行
//回撥函式的兩個引數
// request 請求物件,反映客戶端的一些請求資訊,例如請求路徑
// response 響應物件,給客戶端傳送響應資訊
server.on('request',function(request,response){
    if(request.url=='/'){
        response.write("hello,I am xiaoYi, welcome to index page");
    }else if (request.url == '/login'){ 
        response.write('hello ,welcome to login page');
    }else{
        response.write('sorry,is not found');
    }
    response.end();
})

// 繫結埠號,啟動伺服器
server.listen(3002,function(){
    console.log("伺服器啟動經理撒附近成功了,可以通過http://127.0.0.1 來訪問!");
})
 


  1. 字串的兩種方法

    JSON.parse()   將字串轉換為陣列
    JSON.stringify()  陣列轉換為字串
    
  2. 核心模組

    Node 為JavaScript提供了很多的伺服器級別的API
    例如檔案操作的fs核心模組,http 服務構建的http模組,os 作業系統模
    
  3. OS 核心模組

    檢視cpu 資訊 os.cups()
    檢視記憶體資訊 os.totalmen()
    

nodemon

nodemon 是一個第三方模組工具,可以幫我們解決頻繁修改程式碼重啟伺服器的問題

nodemon 是一個基於Node.js 開發的一個第三方命令列工具,需要獨立安裝

  1. 安裝

    npm install -g nodemon
    
  2. 檢視版本號

    nodemon --version  
    
  3. 如果檢視版本號錯誤 ,則設定 npm 的環境變數

    • 檢視預設路徑

      npm config get prefix
      
    • 設定環境變數

      C:\Users\小毅\AppData\Roaming\npm   //npm 預設的路徑
      
  4. 使用

    node app.js
    // 使用nodemon
    // 只要通過nodemoe 啟動的服務,它會監聽你的檔案變化,當檔案發生變化,自動幫你重啟服務
    nodemon app.js
    

Express

  1. 功能,通過app.get() 方法,根據不同的請求,執行回撥函式

  2. 安裝

    npm install --save express
    
  3. 起步 Express 靜態服務

    //安裝
    //引包
    var express = require ('express');
    
    //建立伺服器應用程式
    
    var app = express();
    
    //當伺服器收到get 請求時 / 的時候,執行回撥函式
    app.get('/',function(req,res){
        res.send("hello express!");
    })
    app.get('/index.html',function(req,res){
        res.send('你好,這就是index.html 頁面');
    })
    
    //公開指定目錄
     app.use('/public/',express.static('./public/'))
    
    
    //設定監聽埠
    app.listen(3001,function(){
      
        console.log('app is running at port 3001')
    })
    
  4. 靜態服務

    //直接訪問public 的檔案
    app.use(express.static('public'))
    // 在要訪問的檔案前 + '/public/'
    app.use('/public',express.static('public'))
    //在要訪問的檔案前 +   '/public/a/b/'
    app.use('/public/a/b/',express.static('/public'))
    

安裝 配置 art- template 模板引擎

  1. 安裝配置

    npm install --save art-template
    npm install --save express-art-template
    
    // 同時安裝
    npm install --save art-template express-art-template
    
    //第一個引數用來配置檢視的字尾名,這裡是.art 則儲存在views 目錄中的模板檔案必須是 .art 檔案
    //預設字尾是 .art 
    app.engine('art',require('express-art-tempalate'))
    
    //修改模板檔案的字尾位 .html
    app.engine('html',require('express-art-template'))
    
  2. 修改預設view檢視 渲染儲存目錄

    app.set("views",目錄路徑)
    
  3. 使用

    app.get('/',function(req,res){
    	//express 預設去專案中的views 目錄找index.html
    	res.render('index.html',{
    		title:'Hello World'
    	})
    })
    

路由

  1. 路由

    • 是一種對映關係

    • 請求方法

    • 請求路徑

      • 請求處理函式
      app
      	.get('./login',函式)
      	.get('./img/img1.jpg',函式)
      	.get('./index.html',函式)
      
  2. get

    //當以GET 方法請求 / 的時候,執行對應的處理函式
    app.get('/',function(req,res){
    	res.send('Hello World');
    })
    
  3. post:

    //當以GET 方法請求 / 的時候,執行對應的處理函式
    app.post('/',function(req,res){
    	res.send('Gpt a POST request')
    })
    

使用node操作mysql

  1. 安裝

    npm install mysql
    

##MongoDB

  1. 連線資料庫

    //資料庫連線
    var mongoose = require('mongoose')
    
    mongoose.connect("mongodb://localhost:27017/study", {useNewUrlParser:true}, function(err){
    
      if(err){
    
        console.log('Connection Error:' + err)
    
      }else{
    
        console.log('Connection success!') }
    
    })
    
  2. 連線資料庫 插入資料

    var mongoose  = require('mongoose');
    
    //連線資料庫
    mongoose.connect("mongodb://localhost/test", {useNewUrlParser:true});
    
    mongoose.Promise = global.Promise;
    
    //建立一個模型  "Cat"  表名(集合) 有一個文件物件  name    
    var Cat = mongoose.model('Cat',{name:String});
    
    // 例項化一個 kitty  例項
     var kitty = new Cat({name:'小毅'});
     
     //持久化儲存 kitty  實列
     kitty.save(function(err){
         if(err){
             console.log(err);
         }else{
             console.log('儲存成功!');
         }
     })
    
  3. Schema 設計文件結構 新增約束 增加資料 查詢資料 刪除資料 更新資料

var mongoose = require("mongoose")
var Schema = mongoose.Schema

//連結資料庫
// 指定的資料庫不需要存在,當插入第一條資料之後,資料庫會被建立出

// MongoClient.connect('mongodb://localhost/test',{ useNewUrlParser: true }, function(err, db) {

// });
mongoose.connect("mongodb://localhost/test", {useNewUrlParser:true}, function(err){
  if(err){
    console.log('Connection Error:' + err)
  }else{
    console.log('Connection success!') }
})

//設計文件結構 (表結構)
//約束的目的是為了保證資料的完整性,不要有髒資料
var userSchema =  new Schema({
    username:{
        type:String,
        required: true
    },
    password:{
        type:String,
        required:true
    },
    email:{
        type:String
    }
})
// 將文件結構釋出為模型
// mongoose.model方法就是用來將一個架構釋出為model
//第一個引數: 傳入一大寫名詞單詞字串用來表示資料庫的名稱
//              mongoose 自動將大寫字串生成小寫複數形式的字串
//第二個引數: 模型建構函式 
//          返回值:模型建構函式
var User = mongoose.model('User',userSchema)//第一個引數是集合名,第二個引數是文件結構模型

//增加資料
// var admin = new User({
//     username: "小毅",
//     password: "12346",
//     email: "183@qq.com"
// })

// admin.save(function(err,ret){
//     if(err){
//         console.log('儲存失敗')
//     }else{
//         console.log('儲存成功')
//         console.log(ret)
//     }
// })

//查詢資料
// console.log('====================查詢全部===========================');

// User.find(function(err,ret){
//     if(err){
//         console.log('查詢失敗');
//     }else{
//         console.log(ret);
//     }
// })

// console.log('====================條件查詢===========================');
// User.find({
//     username:'小毅'
// },function(err,res){
//     if(err){
//         console.log('查詢失敗');
//     }else{
//         console.log(res);
//     }
// })


// console.log('====================條件查詢 單個資料 返回的是物件===========================');
// User.findOne({
//      //如果沒有條件,那麼返回的是第一個資料
//      //如果有條件,但是不滿足條件,則返回  null 
//     username:"admin" 
// },function(err,rep){
//     if(err){
//         console.log(err)
//     }else{
//         console.log(rep)
//     }
// })
// console.log('====================刪除資料===========================');
// User.remove({
//     username:'admin'
// },function(err,res){
//     if(err){
//         console.log('刪除失敗');
//     }else{
//         console.log('刪除成功');
//     }
// })

console.log('====================更新資料===========================');
//第一個引數是資料的 id 號  
//第二個引數是要修改的內容
//第三個引數是回撥函式
User.findByIdAndUpdate('5ebea52f357688299882fd17',{
    password:'helloXiaoYi'
},function(err,rep){
    if(err){
        console.log('更新失敗');
    }else{
        console.log('更新成功'+rep);
    }
})

mongoose-sex-page資料分頁

  1. 安裝使用

    //安裝
    npm install mongoose-sex-page
    //匯入mongoose-sex-page第三方模組
    const pagination = require('mongoose-sex-page'//使用
    let articles = await pagination(Artical).find().page(1),size(2).display(3).populate('author').exec()
    
  2. 引數說明:

    • page指定當前頁
    • size指定每頁顯示的資料條數
    • display 指定客戶端要顯示的頁碼數量
    • exec 向資料庫中傳送查詢請求
  3. 返回的資料 articles 的內容

    {
        "page": 1,   //當前頁
        "size": 2,   //每頁顯示的條數
        "total": 1,   //總共的資料條數
        "records": [{   //查詢出來的具體資料
            "cover": "\\uploads\\upload_21bbd47e2ad7af6b07155f69f497bc46.gif",
            "_id": "5ed9fd90245b563bf8455a98",
            "title": "測試",
            "author": {
                "state": 0,
                "_id": "5ecb59b9bb6655338ce4ae71",
                "username": "小毅",
                "email": "183@qq.com",
                "password""$2b$10$kri4nln1Qrbjh/nvO8i6BeHKG3JTmcILfwXpZ.49A1XeUEaEEiZoa",
                "role": "normal",
                "__v": 0
            },
            "publishDate": "2020-06-05T08:08:48.510Z",
            "content": "<p>代發發的發不發</p>",
            "__v": 0
        }],
        "pages": 1,      //總共頁數
        "display": [1]    //客戶端顯示的頁碼
    }
    

Joi

  1. Joi 是對javaScritpt物件的規則描述語言和驗證器

  2. 下載

    npm install joi
    //引入 Joi模組
    const Joi = require('joi')
    
  3. 定義物件的驗證規則

    const Joi = require('joi');
    // alpahnum() 表示字母或數字
    const schema = {
        username:Joi.string().min(2).max(30).required().error(new Error('使用者名稱不通過')),
        password:Joi.string().regex(/^[a-zA-z0-9]{3,30}$/),
        access_token:[Joi.string(),Joi.number()],
        birthYear:Joi.number().min(1900).max(2020),
        email:Jon.string().emil()
    };
    
  4. 使用 Joi 規則驗證物件

    async function run(){
    	//實施驗證
    	try{
           await Joi.validate({username:'asf'},cheme)        
        }catch(error){
       		console.log(error.message);     
        }
        console.log('驗證通過');
    }
    run();
    

獲取表單post 請求體資料 body - parser

  1. 安裝

    npm install --save body-parser
    
  2. 配置

    var express = require('express')
    var bodyParse = require('body-parser');
    var app = express()
    
    //配置 body-Parser
    //只要加入這個配置,則在res 請求物件就會多出來一個物件:body
    //也就是說可以直接通過req.body來獲取post 請求資料
    //par application/X-www-form-urlencode
    app.use(bodyParser.urlencoded({extended:false}))
    
    //parse application/json
    app.use(bodyParser.json())
    
    
  3. 使用

    app.use(function(req,res){
    // 配置好bade-Parser 後,那麼在請求體裡就會多一個 body 物件,儲存的是 post請求的資料
    	console.log(req.body)
    })
    
    
  4. bodyPaser 只能傳遞普通表單的資料,不能傳遞客戶傳遞的二進位制資料可以使用formidable

formidable

  1. 作用:

    • 解析表單
    • 支援get post 請求引數
    • 檔案上傳
  2. 使用

    //下載 formidable 模組
    npm install formidable
    //引入formidabel 第三方模組
    const formidable = require('formidable');
    //引入 path 第三方模組
    const path = require('path');
    module.exports = (req,res) =>{
        // 1、 建立表單解析物件
        const form = new formidable.IncomingForm();
        // 2、 配置上傳檔案的存放路徑
        form.uploadDir = path.join(__dirname,'../','../','public','uploads')
        // 3、 保留上傳檔案的字尾
        form.keepExtensions = true
        // 4、 解析表單
        form.parse(req,(err,fields,files)=>{
            // 1 err 錯誤對像,若失敗 err為錯誤資訊   若成功   err為null
            // 2 fields  物件型別 儲存普通表單資料
            // 3 files   物件型別 儲存和檔案上傳的相關資料
            res.send(files)
        })
     
    }
    

form 表單

  1. method = " "請求方法

  2. action =" " 請求地址

  3. enctype =" " 指定表單資料的編碼型別

    • application/x-www-form-urlcoded

      name=zhansan&age=18

    • multipart/form-data

      將表單資料編碼成二進位制型別

dateformat

  1. dateformat 時間格式

  2. 使用

    npm install dateformat 
    //引入dateformat 第三方模組  返回一個方法
    const dateFormat = require('dateformat')
    //全域性配置 dateformat 
    //匯入art-template 模板引擎
    const template = require("art-template")
    //向模板內部匯入dateFormate變數
    template.defaults.imports.dateFormat =dateFormat;
    //使用  string1要格式化的時間    string2 要格式化成什麼格式 "yyyy-mm-dd"
    dateFormat(string1,string2)
    

回撥函式

  1. 目的是獲取函式中非同步操作的結果,必須通過回撥函式來獲取

  2. 呼叫 fn() ,得到內部的data

    //宣告 fn
    function fn(callback){
        setTimeout(function(){
            var data = 'hello'
            callback(data)
        },1000)
    }
    //呼叫 fn 
    fn(function(data){
        console.log(data)
    })
    
    
    

密碼加密

  1. 密碼加密 bcrypt ,單程加密方式

    //匯入模組
    const bcrypt = require('bcrypt');
    // 隨機生成字串, gen == > generate生成鹽
    let salt = awit bcrypt.genSalt(10);
    //使用隨機字串對密碼加密
    let pass = await bcrypt.hash('明文密碼',salt);
    
    let iavarable = bcrypt.compare("數入的密碼 ","密文密碼")
    
  2. bcrypt 依賴的其他環境

    1.python 2.x
    2.node-gyp
    	npm install -g node-gyp
    3.windows-build-tools
    	npm install --global --production windows-build-tools
    
  3. 安裝 bcrypt

    // 管理員模式下 的 powerShell 
    npm install bcrypt
    

的結果,必須通過回撥函式來獲取

  1. 呼叫 fn() ,得到內部的data

    //宣告 fn
    function fn(callback){
        setTimeout(function(){
            var data = 'hello'
            callback(data)
        },1000)
    }
    //呼叫 fn 
    fn(function(data){
        console.log(data)
    })
    
    
    

密碼加密

  1. 密碼加密 bcrypt ,單程加密方式

    //匯入模組
    const bcrypt = require('bcrypt');
    // 隨機生成字串, gen == > generate生成鹽
    let salt = awit bcrypt.genSalt(10);
    //使用隨機字串對密碼加密
    let pass = await bcrypt.hash('明文密碼',salt);
    
    let iavarable = bcrypt.compare("數入的密碼 ","密文密碼")
    
  2. bcrypt 依賴的其他環境

    1.python 2.x
    2.node-gyp
    	npm install -g node-gyp
    3.windows-build-tools
    	npm install --global --production windows-build-tools
    
  3. 安裝 bcrypt

    // 管理員模式下 的 powerShell 
    npm install bcrypt
    

相關文章