node學習筆記之39

好程式設計師發表於2020-04-17

node學習筆記 系列之 39

一、url 模組的基本使用

url.parse

url.format

url.resolve

 

 

const url = require("url");

const path = "%20node%20request%20post%E8%AF%B7%E6%B1%82&rsv_spt=1&rsv_iqid=0xb9778e3c000b4a9e&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&oq=request%2520post%25E8%25AF%25B7%25E6%25B1%2582&inputT=1575&rsv_t=3da2Tn%2F7uIuHWTsROFo6yvwMvultNv5wmOTlrQiVQ6KLFbNtnrLXkdd9HWuhNlyq7zNM&rsv_pq=feaadbf200091d61&rsv_sug3=35&rsv_sug2=0&rsv_sug4=2259";

const urlObject = url.parse(path,true);

//console.log(url.format(urlObject));

console.log(url.resolve("/a/b/c","d"));

console.log(url.resolve("/a/b/c","/d"));

二、queryString 模組的基本使用

queryString.escape()

queryString.parse()

queryString.stringify()

queryString.unescape()

 

 

const qs = require("querystring");

var str = "name*alley#age*20";

var obj =  qs.parse(str,"#","*");

//console.log(qs.stringify(obj,"@","!"))

var str = "name=alley=sex=19"

var key = qs.escape("name=alley=sex");

console.log(qs.unescape(key))

 

 

三、events 模組的基本使用

on: 繫結事件

once: 只執行一次事件

emit: 執行匹配的事件

prependListener :將當前事件放到佇列的最前面

removeALLListeners: 移除所有事件

removeListener: 移除指定事件監聽

defaultMaxListeners events 預設的繫結事件只能繫結 10 個如果想繫結多個需要配置

 

 

const EventEmitter = require("events");

class MyEventEmitter extends EventEmitter{};

const myEventEmitter = new MyEventEmitter();

/*

    on: 事件訂閱

    emit :事件觸發

    removeListener :移除一個時間

    removeAllListeners :移除所有事件

    once: 只繫結一次函式

*/

function fn1(val){

    console.log(111,val)

}

function fn2(val){

    console.log(222,val)

}

function fn3(val){

    console.log(333,val)

}

myEventEmitter.once("handle",fn1)

myEventEmitter.once("handle",fn2)

myEventEmitter.once("handle",fn3)

//myEventEmitter.removeListener("handle",fn1)

//myEventEmitter.removeAllListeners("handle")

myEventEmitter.emit("handle","alley")

myEventEmitter.emit("handle","alley")

 

 

四、File System 模組基本使用

得到檔案與目錄的資訊:stat

建立一個目錄:mkdir

建立檔案並寫入內容:writeFile,appendFile

讀取檔案的內容:readFile readFileSync

列出目錄的東西:readdir

重新命名目錄與檔案:rename

刪除目錄與檔案:rmdir,unlink

 

 

const fs = require("fs");

const path = require("path");

fs.stat("./index.js",(err,data)=>{

    console.log(data.isDirectory());

})

var data = fs.statSync("./index.js");

console.log(data.isFile())

fs.mkdir(path.resolve(__dirname,"./demo"),(err)=>{});

fs.writeFile(path.resolve(__dirname,"./demo/index.txt"),"abc",(err)=>{})

fs.readFile(path.resolve(__dirname,"./demo/index.txt"),(err,data)=>{

    console.log(data+"");

})

fs.rename(path.resolve(__dirname,"./demo/index.txt"),path.resolve(__dirname,"./demo/list.txt"),(err)=>{})

fs.readdir(path.resolve(__dirname,"../../ 隨堂案例 "),(err,list)=>{

    console.log(list)

})

fs.unlink(path.resolve(__dirname,"./demo/list.txt"),()=>{})

fs.rmdir(path.resolve(__dirname,"./demo"),(err)=>{})

/*

    stat: 判斷檔案型別

        isFile :判斷是否是一個檔案

        isDirectory: 判斷是否是一個資料夾

    mkdir :建立資料夾

    writeFile(path,content,callback) :建立並寫入

        path :路徑

        content: 內容

        callback :回撥

    

    readFile(path,callback(err,data)): 讀操作

    rename: 重新命名檔案或者資料夾

        oldPath

        newpath

    readdir: 列出資料夾中所有檔案

    unlink: 刪除檔案

    rmdir: 刪除資料夾

*/

 

 

五、stream 檔案流

fs.createReadStream(): 建立可讀檔案流 引數 1 :已有檔案

fs.createWriteStream(): 建立可寫檔案流 引數 1 :檔名稱

pipe: 管道

 

 

// 鏈式使用 pipe

const fs = reqiure("fs");

// 壓縮模組

const zlib = require("zlib");

const read = fs.createReadStream("");

const write = fs.createWriteStream("");

// 先進行壓縮然後在給 write 檔案 16 進位制

read.pipe(zlib.createGzip()).pipe(write);

 

 

六、path 模組的基本使用

path.join

path.resolve

 

 

const path = require("path");

/*

    join: 路徑拼接

    resolve: 將引數轉換為絕對路徑

*/

console.log(path.join("/a","b","c"));

console.log(path.join(__dirname,"./index.js"));

console.log(path.resolve(__dirname,"./index.js"));

 

 

七、process

process.env

process.argv

 

 

console.log(process.env)

var arr = process.argv;

if(arr.indexOf("-v") !== -1){

    console.log("1.11.1");

}else{

    console.log("help....")

}

 

 

八、http 模組

http.createServer

http.get

http.post

request

cheerio 小爬蟲

 

 

createServer

 

const http = require("http");

const server = http.createServer((req,res)=>{

    //console.log(req.url,req.method)

    console.log(req.headers)

    // res.statusCode = 404;

    // res.setHeader("content-type","text/plain;charset=utf8");

    res.writeHead(200,{"content-type":"text/plain;chartset=utf8"})

    res.write(" 我最近很好 ")

    res.write(" 不用你擔心 ")

    res.write(" 再見 ")

    res.end("NodeJS")

})

server.listen(9000,()=>{

    console.log("server address:localhost:9000")

})

http.get

 

const http = require("http");

const path = "( 網頁 )

http.get(path,(res)=>{

    var str = "";

    // 因為資料接收是一塊一塊接收的 類似於流水一樣

    res.on("data",(data)=>{

        str += data;

    })

    res.on("end",()=>{

        console.log(str);

    })

})

var path = " 介面

http.get(path,(res)=>{

    var str = "";

    res.on("data",(data)=>{

        str += data;

    })

    res.on("end",()=>{

        console.log(JSON.parse(str));

    })

})

request

 

const request = require("request");

const qs = require("querystring");

const options = {

    url: "

    method: "POST",

    headers: {

        "os": "wap"

    },

    body: qs.stringify({

        free: 0,

        finish: 0,

        group: 1,

        sortId: "",

        page: 1,

        pageSize: 10,

    })

}

request(options, (err, res, body) => {

    console.log(JSON.parse(body));

})

/*

    1 cnpm install request -S

    request(options,callback(err,res,body))

    err: 錯誤

    res: 整個響應體

    body :響應的資料

    options = {

        method:""

        url:""

        headers:{},

        body:{ 請求的引數 }

    }

*/

小爬蟲

 

const http = require("http");

// 可以讓我們以 jQuery 語法來進行 dom 查詢  並不是對 dom 操作

const cheerio = require("cheerio");

const fs = require("fs");

const path = require("path");

const url = "

http.get(url,(res)=>{

    var str = "";

    res.on("data",(data)=>{

        str += data;

    })

    res.on("end",()=>{

        // str 封裝到 $ 符號中去

       var $ = cheerio.load(str);

       var banner_up_left = $(".banner_up_left>a");

       var arr = [];

        for(var i=0;i<banner_up_left.length;i++){

            var obj = {};

            obj.id = i;

            obj.text = banner_up_left.eq(i).find("span").text();

            arr.push(obj);

        }

       

        fs.readFile(path.join(__dirname,"./data/index.json"),(err,data)=>{

           var dataList = JSON.parse(data+"")

         

            if(!dataList.data){

                dataList.data = [];

            }

          

            dataList.data = arr;

            

            fs.writeFile(path.join(__dirname,"./data/index.json"),JSON.stringify(dataList),(err)=>{})

        })

    })

})

 

 

九、路由

什麼是路由?

路由的作用

前端路由與後端路由

路由核心屬性

supervisor

 

 

const http = require("http");

const path = require("path");

const fs = require("fs");

const url = require("url");

const server = http.createServer((req, res) => {

    const { pathname, query } = url.parse(req.url, true);

    if (pathname == "/") {

        fs.readFile(path.join(__dirname, "./public/index.html"), (err, data) => {

            res.writeHead(200, { "contentType": "text/html;charset=utf8" });

            res.end(data);

        })

    } else if (pathname == "/order") {

        fs.readFile(path.join(__dirname, "./public/html/order.html"), (err, data) => {

            res.writeHead(200, { "contentType": "text/html;charset=utf8" });

            res.end(data);

        })

    } else if (pathname == "/list") {

        fs.readFile(path.join(__dirname, "./public/html/list.html"), (err, data) => {

            res.writeHead(200, { "contentType": "text/html;charset=utf8" });

            res.end(data);

        })

    } else if (pathname == "/css/index.css") {

        fs.readFile(path.join(__dirname, "./public/css/index.css"), (err, data) => {

            res.writeHead(200, { "content-type": "text/css;charset=utf8" });

            res.end(data);

        })

    } else if (pathname == "/js/index.js") {

        fs.readFile(path.join(__dirname, "./public/js/index.js"), (err, data) => {

            res.writeHead(200, { "content-type": "application/x-javascript;charset=utf8" });

            res.end(data);

        })

    } else if (/\/img\/(.*)\.(jpg|png|gif)/.test(pathname)) {

        fs.readFile(path.join(__dirname, "./public/img/" + RegExp.$1 + "." + RegExp.$2), (err, data) => {

            res.writeHead(200, { "content-type": "image/" + RegExp.$2 });

            res.end(data);

        })

    } else if (pathname == "/users/register") {

        let { username, password } = query;

        fs.readFile(path.join(__dirname, "./public/data/user.json"), (err, data) => {

            let userData = JSON.parse(data.toString());

            var bStop = true;

            for (var i = 0; i < userData.data.length; i++) {

                if (userData.data[i].username == username) {

                    bStop = false;

                    break;

                }

            }

            if (bStop) {

                userData.data.push({ username, password });

                fs.writeFile(path.join(__dirname, "./public/data/user.json"), JSON.stringify(userData), (err) => {

                    if (!err) {

                        res.writeHead(200, { "content-Type": "application/json;charset=utf-8" })

                        res.end(JSON.stringify({

                            code: 200,

                            errMsg: "",

                            data: {

                                code: 1,

                                info: " 註冊成功 "

                            }

                        }))

                    }

                })

            } else {

                res.writeHead(200, { "content-Type": "application/json;charset=utf-8" })

                res.end(JSON.stringify({

                    code: 200,

                    errMsg: "",

                    data: {

                        code: 0,

                        info: " 使用者名稱重複 "

                    }

                }))

            }

        })

    }

})

server.listen(9000, () => {

    console.log("server address:127.0.0.1:9000")

})

十、封裝路由級靜態資源處理

const url = require("url");

const fs = require("fs");

const path = require("path");

const qs = require("querystring")

// 收集事件

const routerMap = {

    get:{},

    post:{}

}

const router = function(req,res){

    // res 新增一個 json 方法

    res.json = function(obj){

        res.end(JSON.stringify(obj))

    }

    // 處理靜態資源

    handleStatic(req,res);

    // 獲取使用者請求的方式

    var method = req.method.toLowerCase();

    // 獲取使用者請求的地址

    var {pathname,query} = url.parse(req.url,true);

    if(method === "get"){

        if(routerMap.get[pathname]){

            // query 的值賦值給 req.query

            req.query = query;

            routerMap.get[pathname](req,res)

        }else{

            res.end("404")

        }

    }else if(method === "post"){

        if(routerMap.post[pathname]){

            var str = "";

            // 獲取 post 傳遞的引數

            req.on("data",(data)=>{

                str += data;

            })

            req.on("end",()=>{

               req.body = qs.parse(str);

               routerMap.post[pathname](req,res)

            })

            

        }

    }

}

// 註冊事件

router.get = function(path,callback){

    routerMap.get[path] = callback;

}

// 註冊事件

router.post = function(path,callback){

    routerMap.post[path] = callback;

}

// 處理所有的靜態資源訪問

function handleStatic(req,res){

    var {pathname} = url.parse(req.url,true);

    // 獲取檔案的字尾

    var ext = pathname.substring(pathname.lastIndexOf("."));

    if(pathname ==="/"){

        res.writeHead(200,{"content-type":"text/html;charset=utf8"});

        res.end(getFile(path.join(__dirname,"../public/index.html")))

    }else if(ext === ".css"){

        res.writeHead(200,{"content-type":"text/css;charset=utf8"});

        res.end(getFile(path.join(__dirname,"../public",pathname)));

    }else if(ext === ".js"){

        res.writeHead(200,{"content-type":"application/x-javascript;charset=utf8"});

        res.end(getFile(path.join(__dirname,"../public",pathname)));

    }else if(/.*\.(jpg|png|gif)/.test(ext)){

        res.writeHead(200,{"content-type":`image/${RegExp.$1};charset=utf8`});

        res.end(getFile(path.join(__dirname,"../public",pathname)));

    }else if(ext === ".html"){

        res.writeHead(200,{"content-type":"text/html;charset=utf8"});

        res.end(getFile(path.join(__dirname,"../public",pathname)));

    }

}

function getFile(filePath){

    return fs.readFileSync(filePath);

}

module.exports = router;

十一、mongoodb mongoose 的基本使用

1 mongodb 安裝

 

下載地址:

下一步傻瓜式安裝

配置環境變數

啟動mongod --dbpath c:\data\db 開啟資料庫伺服器 ( 開啟 )

終端末尾顯示27017 代表成功

 

 

2 、關係型資料庫與非關聯式資料庫區別

 

優點:

1 )成本: nosql 資料庫簡單易部署,基本都是開源軟體,不需要像使用 oracle 那樣花費大量成本購買使用,相比關係型資料庫價格便宜。

2 )查詢速度: nosql 資料庫將資料儲存於快取之中,關係型資料庫將資料儲存在硬碟中,自然查詢速度遠不及 nosql 資料庫。

3 )儲存資料的格式: nosql 的儲存格式是 key,value 形式、文件形式、圖片形式等等,所以可以儲存基礎型別以及物件或者是集合等各種格式,而資料庫則只支援基礎型別。

4 )擴充套件性:關係型資料庫有類似 join 這樣的多表查詢機制的限制導致擴充套件很艱難。

缺點:

1 )維護的工具和資料有限,因為 nosql 是屬於新的技術,不能和關係型資料庫 10 幾年的技術同日而語。

2 )不提供對 sql 的支援,如果不支援 sql 這樣的工業標準,將產生一定使用者的學習和使用成本。

3 )不提供關係型資料庫對事物的處理。

3 mongodb 常用命令

 

mongod --dbpath c:\data\db 開啟資料庫伺服器 ( 開啟 )

27017---- mongodb 的埠號 http:80 || 8080 https:443

 

mongo 進入資料庫伺服器

show dbs 檢視資料庫伺服器中有多少資料庫

use 資料庫名稱 建立 / 切換資料庫 如果資料庫中沒有表的情況下 資料庫並不會真正的建立

db || db.getName() 檢視當前使用的資料庫

db.dropDatabase() 刪除資料庫

 

表的操作

db.createCollection(" 表名稱 ") 建立表

db.getCollectionNames() 獲取資料庫中所有的表

db.getCollection(' 表名稱 ') 使用某一張表

db. 表名 .drop() 刪除某一張表

 

db. 表名 .save({ 欄位 })

 

db. 表名 .remove({}) 刪除所有

db. 表名 .remove({ 欄位 }) 刪除指定欄位

 

db. 表名 .update({ 欄位 },{$set:{ 欄位 }})

db. 表名 .update({ 欄位 },{$inc:{ 欄位 ( 數字 )}})

 

db. 表名 .find() 查詢所有資料

db. 表名 .find({age:19}) 查詢指定欄位

db. 表名 .find({age:{$gt:22}}) 大於 22 的資料

db. 表名 .find({age:{$lt:22}}) 小於 22 的資料

db. 表名 .find({age:{$gte:22}}) 大於等於 22 的資料

db. 表名 .find({age:{$lte:22}) 小於等於 22 的資料

db. 表名 .find({age:{$gte:30,$lte:22}) 大於等於 30 小於等於 22 的資料

db. 表名 .find({name:/alley/}) 模糊查詢 找到資料中有 alley 的資料

db. 表名 .find({age:/^alley/}) 查詢首字元是 alley

db. 表名 .find({age:/alley$/}) 查詢尾字元是 alley

db. 表名 .find({},{name:1,_id:0}) 只顯示 name 這個欄位

db. 表名 .find().sort({age:1}) 正序

db. 表名 .find().sort({age-1}) 降序

db. 表名 .find().limit(n) 顯示多少條資料

db. 表名 .find().skip(n) 跳過多少條資料

db. 表名 .find().skip(n).limit(m) 跳過多少條 顯示多少條

db. 表名 .findOne({}) 查詢一條資料

db. 表名 .find().count() 查詢表中有多少條資料


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2686750/,如需轉載,請註明出處,否則將追究法律責任。

相關文章