欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解Node.js服務(wù)器動態(tài)資源處理

 更新時間:2024年04月25日 14:37:44   作者:想想aw  
動態(tài)資源處理也就是對數(shù)據(jù)進(jìn)行重新排序來讀寫數(shù)據(jù)庫,讀取反序列化,寫入序列化,這篇文章主要來和大家聊聊Node.js中的服務(wù)器動態(tài)資源處理,感興趣的可以了解下

一、node.js服務(wù)器動態(tài)資源處理與靜態(tài)資源處理的區(qū)別

靜態(tài)與動態(tài)服務(wù)器主要區(qū)別于是否讀取數(shù)據(jù)庫,若然在數(shù)據(jù)庫中的資料處理中將數(shù)據(jù)轉(zhuǎn)換成可取用格式的結(jié)構(gòu),也就是說把對象轉(zhuǎn)化為可傳輸?shù)淖止?jié)序列過程稱為序列化,反之則為反序列化。

簡單來說,它比起靜態(tài)資源較復(fù)雜,因為它會隨用戶不同、響應(yīng)內(nèi)容不同而不斷產(chǎn)生變化

二、什么是動態(tài)資源處理

以JSON與JS為例,JSON.stringify()對數(shù)據(jù)序列化,JSON.parse()對數(shù)據(jù)反序列化。動態(tài)處理也就是對數(shù)據(jù)進(jìn)行重新排序來讀寫數(shù)據(jù)庫,讀取反序列化,寫入序列化。

三、處理動態(tài)資源的方法

將頁面內(nèi)容動態(tài)化。使用到第三方模塊——>模板引擎  去動態(tài)將我的數(shù)據(jù)嵌入到我的網(wǎng)頁中去。

什么是模板引擎?見 文末補(bǔ)充內(nèi)容

四、代碼示例

(1)我們將首頁、登錄、注冊三個html靜態(tài)頁面和用戶列表users.html寫在views這個大文件夾下。css樣式和images圖片放入public這個大文件夾下。創(chuàng)建一個data大文件夾,data下面建一個user.json文件來專門存儲用戶數(shù)據(jù)

簡單寫一下首頁、注冊、登錄頁面的html靜態(tài)頁面的樣式。此處省略。具體見 詳解Node.js服務(wù)器靜態(tài)資源處理

動態(tài)資源處理具體表現(xiàn)就是我的用戶列表渲染功能(users.html)和我的不同錯誤提示功能(404.html)。

用戶列表渲染功能可以將我的user.json里面注冊成功的用戶數(shù)據(jù)渲染到我服務(wù)器用戶列表頁面

users.html 用戶列表:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>用戶列表</title>
  <link rel="stylesheet" href="../public/css/main.css" rel="external nofollow" >
</head>
<body>
  <h1>用戶列表</h1>
  <img src="../public/images/01.png" alt=""><br>
  <ul>
    <!-- 循環(huán)li -->
    <% for(let username in users){ %>
    <li>
        <!-- 取出屬性名和密碼這個屬性值,放入li里面 -->
        <%=username %> : <%=users[username] %>
    </li>
    <% } %>
  </ul>
</body>
</html>

404.html  不同錯誤提示:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>404</title>
</head>
<style>
  body {
    background-color:pink;
  }
</style>
<body>
  <h1>
    <!-- 定義模板 -->
    <%= msg %>
  </h1>
</body>
</html>

(2)在我的測試代碼的終端 npm install underscore -save安裝underscore渲染模板引擎 、npm install querystring安裝querystring查詢模塊

(3) 測試代碼如下:

const http = require('http');
const fs = require('fs');
const path = require('path');
const url = require('url');
// 聲明一個專門存放所有用戶的變量
var users;
// 導(dǎo)入查詢參數(shù)的模塊
const querystring = require('querystring');
// 導(dǎo)入underscore渲染模板
const _ =require('underscore');
//使用underscore渲染模板
function render(data){
    // 讀取模板內(nèi)容
    let temp=fs.readFileSync(path.join(__dirname,'views/404.html'));
    // 獲取渲染函數(shù)
    let compiled=_.template(temp.toString());
    // 渲染模板
    return compiled(data); 
}
//創(chuàng)建服務(wù)器
const server = http.createServer();
//讀取文件。讀取user.json存放用戶數(shù)據(jù)的文件
fs.readFile(path.join(__dirname, 'data/users.json'), (err, data) => {
    if (err) {
        users = {};
    } else {
        users = JSON.parse(data.toString()); //如果讀取正確就將讀到的內(nèi)容轉(zhuǎn)換為一個對象存到users里
    }
})
//服務(wù)器做出請求響應(yīng)
server.on('request', (req, res) => {
    let objurl = url.parse(req.url); //將url轉(zhuǎn)為一個對象才能獲取到它的pathname
    let pathname = objurl.pathname;
    // 對pathname做處理
    if (pathname.startsWith('/public')) {
        // 找到當(dāng)前項目文件夾,再將相對路徑轉(zhuǎn)為絕對路徑
        let p = path.join(__dirname, pathname);
        fs.readFile(p, (err, data) => {
            if (err) {
                res.end(render({msg:'訪問的文件不存在'})); //可以使用中文,因為現(xiàn)在是html頁面去顯示的
            } else {
                res.end(data);
            }
        })
    } else if (pathname == '/' || pathname == '/home') {
        let p = path.join(__dirname, 'views/index.html');
        fs.readFile(p, (err, data) => {
            if (err) {
                res.end(render({msg:'訪問的文件不存在'}));
            } else {
                res.end(data);
            }
        })
    } else if (pathname == '/regist') { //建一個文件夾data專門來儲存數(shù)據(jù) 里面建一個users.json的文件
        let p = path.join(__dirname, 'views/regist.html');
        fs.readFile(p, (err, data) => {
            if (err) {
                res.end(render({msg:'訪問的文件不存在'}));
            } else {
                res.end(data);
            }
        })
 
    } else if (pathname == '/login') {
        let p = path.join(__dirname, 'views/login.html');
        fs.readFile(p, (err, data) => {
            if (err) {
                res.end(render({msg:'訪問的文件不存在'}));
            } else {
                res.end(data);
            }
        })
    } else if (pathname == '/doRegist') {
        // Node.js 的 querystring 模塊用于解析和格式化 URL 查詢字符串:
        // 1. 將字符串參數(shù)解析成對象
        // querystring.parse(url)
        // 2. 將對象參數(shù)解析成字符串
        // querystring.stringify(urlObject)
        let query = querystring.parse(objurl.query);
        let username = query.username;
        let password = query.password;
        if (users[username]) {
            res.end(render({msg:'用戶名已存在,不能注冊!'}));
        } else {
            //因為users里面是一個對象。所以只能屬性名=值的形式。故屬性名 = 密碼(密碼相當(dāng)于這個屬性名對應(yīng)的屬性值)
            users[username] = password;
            //利用JSON.stringify(users)將users對象轉(zhuǎn)為字符串重新寫到文件里去
            fs.writeFile(path.join(__dirname, 'data/users.json'), JSON.stringify(users), (err) => {
                if (err) {
                    res.end(render({msg:'注冊失敗'}));
                } else {
                    res.end(render({msg:'注冊成功'}));
                }
            })
 
        }
 
    } else if (pathname == '/doLogin') {
        let query = querystring.parse(objurl.query);
        let username = query.username;
        let password = query.password;
        // 判斷users的用戶名和密碼有無
        if (users[username] && users[username] == password) { //用戶名 && 密碼
            res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
            res.end(render({msg:'登錄成功'}));
        } else {
            res.writeHead(502, { 'Content-Type': 'text/html;charset=utf-8' });
            res.end(render({msg:'用戶名或密碼錯誤,登錄失敗'}));
        }
    } else if (pathname == '/list') {
        let p=path.join(__dirname,'views/users.html');
        fs.readFile(p,(err,data)=>{
            if(err){
                res.end(render({msg:'訪問的文件不存在'}));
            }else{
                //獲得渲染函數(shù) 
                let compiled=_.template(data.toString()); 
                // 調(diào)用渲染函數(shù)來生成html內(nèi)容
                let html=compiled({users:users}); //我們在模板里取的是users的屬性,所以不能簡寫成users,而是users:users
                res.end(html);
                
            }
        })
    }
});
 
server.listen(3000, '127.0.0.1', () => {
    console.log('Server is running at http://127.0.0.1:3000');
})

(4)結(jié)果顯示

當(dāng)我的用戶數(shù)據(jù)已被注冊時:

動態(tài)顯示我的404.html頁面

我完成用戶注冊時,我點擊用戶列表,顯示結(jié)果如下:

綜上所述,相比我的靜態(tài)資源處理而言,我的動態(tài)資源處理就相對效率較高,對于不同的錯誤信息,我可以直接使用我的404.html模板,直接在我的運(yùn)行代碼中顯示 res.end(render({msg:'錯誤內(nèi)容'})); 并且我可以直接使用用戶數(shù)據(jù)模板user.html使用<% %> 執(zhí)行javascript代碼??梢灾苯釉谖曳?wù)器端頁面展示我的所有成功注冊的用戶數(shù)據(jù)?;睘楹啞?/p>

五、知識補(bǔ)充

node.js 什么是模板引擎

在 Web 開發(fā)中,數(shù)據(jù)的呈現(xiàn)通常是基于 HTML 和 CSS 的,而數(shù)據(jù)的變化又是非常頻繁的,需要根據(jù)數(shù)據(jù)動態(tài)生成 HTML 標(biāo)記。手動拼接 HTML 標(biāo)記顯然是一種非常低效的方式,不僅容易出錯,而且難以維護(hù)。使用,我們使用到了模板引擎來解決這一問題。 

模板引擎概念

模板引擎是一種將數(shù)據(jù)和模板結(jié)合起來生成最終結(jié)果的工具。它將一個模板和一個數(shù)據(jù)對象轉(zhuǎn)為輸入,通過模板解析和渲染生成最終的結(jié)果。通俗來說,模板引擎就是用來生成html等標(biāo)記的工具。可以分解為兩部分:

1.模板:一個模子(結(jié)構(gòu))。依據(jù)不同數(shù)據(jù)套不同的邏輯

2.引擎:一個處理器(編譯、運(yùn)行),最后渲染出HTML代碼

模板引擎作用

模板引擎在Web開發(fā)中扮演著重要角色,其主要作用包括:

(1)界面與數(shù)據(jù)分離

(2)業(yè)務(wù)代碼與邏輯代碼分離

(3) 生成特定格式的文檔

(4)支持邏輯控制語句

(5)模板繼承

(6)提高開發(fā)效率

常用的模板引擎:

(1)underscore

(2)art-template

(3)ejs

(4)jade

下面,我們來具體介紹常用的underscore模板引擎:

underscore模板引擎:

(1)安裝underscore

npm install underscore —save

(2)導(dǎo)入underscore

var_=require('underscore')

(3)補(bǔ)充:依賴項問題

如上述的安裝underscore后面要接 —save,意思是將模塊安裝到項目目錄下,并在package文件的dependencies節(jié)點寫入依賴。

-g 的意思是將模塊安裝到全局,具體安裝到磁盤哪個位置,要看 npm config prefix 的位置。

-save-dev 的意思是將模塊安裝到項目目錄下,并在package文件的devDependencies節(jié)點寫入依賴。

(4)在underscore模板文件中制定渲染規(guī)則

<%= %> 插入數(shù)據(jù)

eg:

<%=name%>

<% %> 執(zhí)行javascript代碼(一定要遵循js語法規(guī)則)

eg:

<%
for(let i=0;;i<3;i++){...}
%>

(5)使用underscore渲染模板

獲取渲染函數(shù)

var compiled=_.template(data)

注意 _是模板引擎的對象,data是模板文件內(nèi)容

渲染數(shù)據(jù)生成html內(nèi)容

var htmlstr=compiled(dataObj)

注意 dataObj是模板文件所需數(shù)據(jù)對象

到此這篇關(guān)于一文詳解Node.js服務(wù)器動態(tài)資源處理的文章就介紹到這了,更多相關(guān)Node.js服務(wù)器動態(tài)資源處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Wondows下Node.js使用MongoDB的環(huán)境配置

    詳解Wondows下Node.js使用MongoDB的環(huán)境配置

    這篇文章主要介紹了詳解Wondows下Node.js使用MongoDB的環(huán)境配置,這里使用到了Mongoose驅(qū)動來讓JavaScript操作MongoDB,需要的朋友可以參考下
    2016-03-03
  • 詳解Puppeteer前端自動化測試實踐

    詳解Puppeteer前端自動化測試實踐

    這篇文章主要介紹了詳解Puppeteer前端自動化測試實踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • 使用Typescript和ES模塊發(fā)布Node模塊的方法

    使用Typescript和ES模塊發(fā)布Node模塊的方法

    這篇文章主要介紹了使用Typescript和ES模塊發(fā)布Node模塊的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 使用NodeJS對一個字符串加密的操作方法示例

    使用NodeJS對一個字符串加密的操作方法示例

    Node.js中的crypto模塊提供了多種加密算法,可以用來加密字符串,AES和RSA是其中兩種常用的算法,本文介紹如何使用NodeJS對一個字符串加密,感興趣的朋友一起看看吧
    2025-01-01
  • node.js中的fs.write方法使用說明

    node.js中的fs.write方法使用說明

    這篇文章主要介紹了node.js中的fs.write方法使用說明,本文介紹了fs.write的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 使用express+multer實現(xiàn)node中的圖片上傳功能

    使用express+multer實現(xiàn)node中的圖片上傳功能

    這篇文章主要介紹了使用express+multer實現(xiàn)node中的圖片上傳功能,需要的朋友可以參考下
    2018-02-02
  • 一文學(xué)會如何升級npm管理的各依賴版本

    一文學(xué)會如何升級npm管理的各依賴版本

    npm在前端開發(fā)流程中提供了非常完善的自動化工具鏈,已成為每個前端開發(fā)者必備的工具,下面這篇文章主要給大家介紹了關(guān)于如何升級npm管理的各依賴版本,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Node批量爬取頭條視頻并保存方法

    Node批量爬取頭條視頻并保存方法

    在本篇文章中我們給大家介紹了node爬取頭條里面的視頻,并進(jìn)行批量保存的方法,有需要的朋友可以測試以下。
    2018-09-09
  • node+express實現(xiàn)分頁效果

    node+express實現(xiàn)分頁效果

    這篇文章主要為大家詳細(xì)介紹了node+express實現(xiàn)分頁效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Express下采用bcryptjs進(jìn)行密碼加密的方法

    Express下采用bcryptjs進(jìn)行密碼加密的方法

    本篇文章主要介紹了Express下采用bcryptjs進(jìn)行密碼加密的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02

最新評論