国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【Node Hero】5. Node.js 數(shù)據(jù)庫教程

Hujiawei / 1838人閱讀

摘要:是一種設(shè)計用于關(guān)系型數(shù)據(jù)庫的查詢語言。另一方面,數(shù)據(jù)庫在最近十年變得相當(dāng)流行。大多數(shù)數(shù)據(jù)庫都有驅(qū)動程序可以用,它們在上也有庫。我們已經(jīng)完成了在中使用數(shù)據(jù)庫所必須知道的所有基礎(chǔ)知識。

本文轉(zhuǎn)載自:眾成翻譯
譯者:網(wǎng)絡(luò)埋伏紀(jì)事
鏈接:http://www.zcfy.cc/article/1751
原文:https://blog.risingstack.com/node-js-database-tutorial/

如下的 Node.js 數(shù)據(jù)庫教程將展示如何設(shè)置 Node.js 應(yīng)用程序的數(shù)據(jù)庫,并且教你使用它的基礎(chǔ)知識。

將數(shù)據(jù)存儲在一個全局變量中

正如在上章所學(xué),為用戶提供靜態(tài)頁面,可能適合著陸頁或者個人博客。但是,如果想交付個性化的內(nèi)容,就必須將數(shù)據(jù)存在某個地方。

舉個例子:用戶注冊。可以為個別用戶提供定制內(nèi)容,或者只讓它在用戶通過身份驗證后可用。

如果用戶想注冊你的應(yīng)用程序,你可能想創(chuàng)建一個路由處理器來讓他注冊成功:

const users = []

app.post("/users", function (req, res) {  
    // 從請求消息體中獲取用戶發(fā)送的數(shù)據(jù)
    const user = req.body
    users.push({
      name: user.name,
      age: user.age
    })
    res.send("注冊成功!")
})

通過這種方式,可以把用戶存儲在一個全局變量中,這個全局變量在應(yīng)用程序生命周期都會駐留在內(nèi)存中。

使用這種方式會因為幾個原因而帶來問題:

內(nèi)存很貴,

每次重新啟動應(yīng)用程序時,內(nèi)存都會重置,

如果不清理的話,有時候會遇到棧溢出。

將數(shù)據(jù)存儲在文件中

出現(xiàn)在你腦海中的下一件事情可能是將數(shù)據(jù)存儲在文件中。

如果把用戶數(shù)據(jù)永久性地存儲在文件系統(tǒng)中,就可以避免之前列出的問題。

實踐中,這個方法看起來就像如下這樣:

const fs = require("fs")

app.post("/users", function (req, res) {  
    const user = req.body
    fs.appendToFile("users.txt", JSON.stringify({ name: user.name, age: user.age }), (err) => {
        res.send("注冊成功!")
    })
})

這種方式我們不會丟失用戶數(shù)據(jù),即使服務(wù)器重啟后也不會。這種解決方案也是經(jīng)濟有效的,因為買存儲空間比買內(nèi)存更便宜。

不幸的是,用這種方式存儲用戶數(shù)據(jù)依然有幾個缺陷:

添加用戶數(shù)據(jù)是可以的,但是想想更新或者刪除。

如果是存到文件,并行訪問文件就沒那么容易了(系統(tǒng)級鎖會阻止寫數(shù)據(jù))。

當(dāng)擴展應(yīng)用程序時,沒法把文件分割放在服務(wù)器之間(可以,但是方法超出了本教程的等級)。

這就是真實數(shù)據(jù)庫起作用的地方。

你可能已經(jīng)聽說過數(shù)據(jù)庫有兩種主要類型:SQL 和 NOSQL。

SQL

我們以 SQL 開始。SQL 是一種設(shè)計用于關(guān)系型數(shù)據(jù)庫的查詢語言。根據(jù)正在使用的產(chǎn)品,SQL 有幾種風(fēng)格,但基本原理都是相同。

數(shù)據(jù)本身會被存儲在表中,每個插入的塊將會被表示為表中的一行,就像 Google Sheets 或者 Microsoft Excel 中的一樣。

在一個 SQL 數(shù)據(jù)庫中,你可以定義 schema - 這些 schema 會為你要放進(jìn)去的數(shù)據(jù)提供一個骨架。在存儲數(shù)據(jù)之前,必須設(shè)置不同值的類型。例如,必須為用戶數(shù)據(jù)定義一個表,必須告訴數(shù)據(jù)庫用戶名是字符串類型,年齡是整型。

NoSQL

另一方面,NoSQL 數(shù)據(jù)庫在最近十年變得相當(dāng)流行。如果使用 NoSQL,就不需要定義 schema,可以存儲任意 JSON。這對 JavaScript 很方便,因為在 JavaScript 中將對象轉(zhuǎn)換為 JSON 很容易。不過,使用 NoSQL 要當(dāng)心,因為它無法保證數(shù)據(jù)的一致性,也無法知道數(shù)據(jù)庫中存的是什么。

Node.js 和 MongoDB

我們總會聽到對 Node.js 的一個常見誤解:

"Node.js 只能用 MongoDB( MongoDB 是最流行的 NoSQL 數(shù)據(jù)庫)。"

根據(jù)我的經(jīng)驗,這是不正確的。大多數(shù)數(shù)據(jù)庫都有驅(qū)動程序可以用,它們在 NPM 上也有庫。據(jù)我看,它們與 MongoDB 一樣簡單易用。

Node.js 和 PostgreSQL

為簡單起見,我們打算在下面的示例中使用 SQL。我選擇的是 PostgreSQL。

要讓 PostgreSQL 啟動和運行,必須將它安裝到你的電腦上。如果是 Mac,就用 homebrew 安裝 PostgreSQL。另外,如果是 Linux,就用你用的包管理器安裝它。

進(jìn)一步的信息請閱讀這篇優(yōu)秀的指南,讓你的第一個數(shù)據(jù)庫啟動和運行起來。

如果你打算用一種數(shù)據(jù)庫瀏覽工具,我推薦使用命令行程序 psql - 它與 PostgreSQL 服務(wù)器安裝程序綁在一起。這里有一個小速查表,如果你開始用 PostgreSQL,這玩意遲早會派上用場。

如果不喜歡命令行界面,可以用開源的 PostgreSQL 管理圖形界面工具 pgAdmin。

注意,SQL 本身就是一門語言,我們不會講解它所有功能,只會提及最簡單的。要了解更多的關(guān)于 SQL 的知識,這里有不少講解 PostgreSQL 基礎(chǔ)知識的課程都還不錯。

Node.js 數(shù)據(jù)庫交互

首先,得創(chuàng)建要使用的數(shù)據(jù)庫。為此,在終端中鍵入如下命令:

createdb node_hero

然后,創(chuàng)建用戶表:

CREATE TABLE users(  
  name VARCHAR(20),
  age SMALLINT
);

最后,回到編碼。如下是通過 Node.js 程序與數(shù)據(jù)交互的代碼:

"use strict"

const pg = require("pg")  
const conString = "postgres://username:password@localhost/node_hero" // 確保要匹配你自己數(shù)據(jù)庫的憑據(jù)

pg.connect(conString, function (err, client, done) {  
  if (err) {
    return console.error("error fetching client from pool", err)
  }
  client.query("SELECT $1::varchar AS my_first_query", ["node hero"], function (err, result) {
    done()

    if (err) {
      return console.error("error happened during query", err)
    }
    console.log(result.rows[0])
    process.exit(0)
  })
})

這是一個簡單的 PostgreSQL "hello world" 示例。注意第一個參數(shù)是 SQL 命令字符串,第二個參數(shù)是給查詢提供的參數(shù)值數(shù)組。

如果就按用戶輸入插入到數(shù)據(jù)庫,會有很大的安全問題。這種方式可以防止 SQL 注入式攻擊,這種類型的攻擊是攻擊者試圖利用完全未處理的 SQL 查詢。在創(chuàng)建任何面向用戶的應(yīng)用程序時,必須總要考慮這種情況。要學(xué)習(xí)更多關(guān)于 SQL 安全性的知識,請查看我們的 Node.js 應(yīng)用程序安全備忘錄。

下面繼續(xù)前一示例。

app.post("/users", function (req, res, next) {  
  const user = req.body

  pg.connect(conString, function (err, client, done) {
    if (err) {
      // 將錯誤傳遞給 express 錯誤處理器
      return next(err)
    }
    client.query("INSERT INTO users (name, age) VALUES ($1, $2);", [user.name, user.age], function (err, result) {
      done() //這個 done 回調(diào)會通知 pg 驅(qū)動程序連接可以被關(guān)閉,或者返回給連接緩沖池

      if (err) {
        // 將錯誤傳遞給 express 錯誤處理器
        return next(err)
      }

      res.send(200)
    })
  })
})

完成解鎖:用戶存儲在數(shù)據(jù)庫中!:) 現(xiàn)在我們試著獲取他們。下一步,為用戶獲取給應(yīng)用程序添加一個新的端點。

app.get("/users", function (req, res, next) {  
  pg.connect(conString, function (err, client, done) {
    if (err) {
      // 將錯誤傳遞給 express 錯誤處理器
      return next(err)
    }
    client.query("SELECT name, age FROM users;", [], function (err, result) {
      done()

      if (err) {
        // 將錯誤傳遞給 express 錯誤處理器
        return next(err)
      }

      res.json(result.rows)
    })
  })
})
也不算很難,對吧?

現(xiàn)在你可以運行提供給 Node.js 應(yīng)用程序的任何復(fù)雜 SQL 查詢。

使用這種技術(shù),你可以將數(shù)據(jù)永久存儲在應(yīng)用程序中,多虧了 Node-postgreSQL 模塊團(tuán)隊的辛勤勞動,使存儲數(shù)據(jù)變得易如反掌。

我們已經(jīng)完成了在 Nodejs 中使用數(shù)據(jù)庫所必須知道的所有基礎(chǔ)知識。現(xiàn)在自己去創(chuàng)建一些東西好了。

嘗試、實驗,因為這是稱為一個真正的 Node 勇士的最佳方式。實踐并準(zhǔn)備下一章如果與第三方 API 通訊!

如果你有任何有本教程相關(guān)的或者與在 Node.js 中使用數(shù)據(jù)庫的問題,只管提出來!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84979.html

相關(guān)文章

  • Node Hero】1. 開始使用 Node.js

    摘要:使用一個事件驅(qū)動的非阻塞式的模型,讓它輕量而高效。也就是說提供了用編寫服務(wù)器的可能性,這種服務(wù)器具有令人難以置信的性能。正如官方聲明所說是一個使用與瀏覽器相同引擎的運行時。這意味著有兩個發(fā)布版本穩(wěn)定版和試驗版。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1748原文:https://blog.risingstack.com/nod...

    hqman 評論0 收藏0
  • Node Hero】8. 使用 Passport.js 進(jìn)行 Node.js 身份驗證

    摘要:本文轉(zhuǎn)載自眾成翻譯譯者網(wǎng)絡(luò)埋伏紀(jì)事鏈接原文本教程中將學(xué)習(xí)如何使用和實現(xiàn)一個本地身份驗證策略。我們將有一個用戶頁,一個備注頁,和一些與身份驗證相關(guān)的功能。下一步下一章主要涉及應(yīng)用程序的單元測試。你會學(xué)習(xí)單元測試測試金字塔測試替代等概念。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1755原文:https://blog.risings...

    CoderStudy 評論0 收藏0
  • Node Hero】7. Node.js 項目結(jié)構(gòu)

    摘要:本教程會學(xué)習(xí)如何正確組織一個項目的結(jié)構(gòu),從而在應(yīng)用程序開始增長時避免混亂。項目結(jié)構(gòu)的五個基本規(guī)則組織項目有不少可能的方式并且每種已知的方式都有其興衰。過去在,我們有機會創(chuàng)建各種規(guī)模的高效應(yīng)用程序,也獲得了大量關(guān)于項目結(jié)構(gòu)注意事項的見解。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1756原文:https://blog.rising...

    張紅新 評論0 收藏0
  • Node Hero】6. Node.js Request 模塊

    摘要:狀態(tài)碼描述了請求的結(jié)果,它對錯誤處理是必不可少的。響應(yīng)還沒完成成功這些狀態(tài)碼表示請求被接收并正確處理了。服務(wù)器錯誤當(dāng)服務(wù)器由于某些錯誤不能完成有效的請求時,就發(fā)送這些狀態(tài)碼。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1758原文:https://blog.risingstack.com/node-hero-node-js-req...

    BlackHole1 評論0 收藏0
  • Node Hero】9. Node.js 單元測試

    摘要:基本上,測試金字塔描述你應(yīng)該編寫單元測試集成測試和端到端測試。集成測試要比端到端測試多,單元測試甚至要更多一些。應(yīng)用程序單元測試編寫單元測試,是為了看看給定的模塊單元是否工作。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1754原文:https://blog.risingstack.com/node-hero-node-js-un...

    104828720 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<