【Node Hero】5. Node.js 數據庫教程

本文轉載自:衆成翻譯
譯者:網絡埋伏紀事
連接:http://www.zcfy.cc/article/1751
原文:https://blog.risingstack.com/node-js-database-tutorial/node

以下的 Node.js 數據庫教程將展現如何設置 Node.js 應用程序的數據庫,而且教你使用它的基礎知識。sql

將數據存儲在一個全局變量中

正如在上章所學,爲用戶提供靜態頁面,可能適合着陸頁或者我的博客。可是,若是想交付個性化的內容,就必須將數據存在某個地方。數據庫

舉個例子:用戶註冊。能夠爲個別用戶提供定製內容,或者只讓它在用戶經過身份驗證後可用。express

若是用戶想註冊你的應用程序,你可能想建立一個路由處理器來讓他註冊成功:npm

const users = []

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

經過這種方式,能夠把用戶存儲在一個全局變量中,這個全局變量在應用程序生命週期都會駐留在內存中。json

使用這種方式會由於幾個緣由而帶來問題:數組

  • 內存很貴,安全

  • 每次從新啓動應用程序時,內存都會重置,服務器

  • 若是不清理的話,有時候會遇到棧溢出。網絡

將數據存儲在文件中

出如今你腦海中的下一件事情多是將數據存儲在文件中。

若是把用戶數據永久性地存儲在文件系統中,就能夠避免以前列出的問題。

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

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('註冊成功!')
    })
})

這種方式咱們不會丟失用戶數據,即便服務器重啓後也不會。這種解決方案也是經濟有效的,由於買存儲空間比買內存更便宜。

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

  • 添加用戶數據是能夠的,可是想一想更新或者刪除。

  • 若是是存到文件,並行訪問文件就沒那麼容易了(系統級鎖會阻止寫數據)。

  • 當擴展應用程序時,無法把文件分割放在服務器之間(能夠,可是方法超出了本教程的等級)。

這就是真實數據庫起做用的地方。

你可能已經據說過數據庫有兩種主要類型:SQL 和 NOSQL。

SQL

咱們以 SQL 開始。SQL 是一種設計用於關係型數據庫的查詢語言。根據正在使用的產品,SQL 有幾種風格,但基本原理都是相同。

數據自己會被存儲在表中,每一個插入的塊將會被表示爲表中的一行,就像 Google Sheets 或者 Microsoft Excel 中的同樣。

在一個 SQL 數據庫中,你能夠定義 schema - 這些 schema 會爲你要放進去的數據提供一個骨架。在存儲數據以前,必須設置不一樣值的類型。例如,必須爲用戶數據定義一個表,必須告訴數據庫用戶名是字符串類型,年齡是整型。

NoSQL

另外一方面,NoSQL 數據庫在最近十年變得至關流行。若是使用 NoSQL,就不須要定義 schema,能夠存儲任意 JSON。這對 JavaScript 很方便,由於在 JavaScript 中將對象轉換爲 JSON 很容易。不過,使用 NoSQL 要小心,由於它沒法保證數據的一致性,也沒法知道數據庫中存的是什麼。

Node.js 和 MongoDB

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

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

根據個人經驗,這是不正確的。大多數數據庫都有驅動程序能夠用,它們在 NPM 上也有庫。據我看,它們與 MongoDB 同樣簡單易用。

Node.js 和 PostgreSQL

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

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

Node.js Database Example PostgreSQL

進一步的信息請閱讀這篇優秀的指南,讓你的第一個數據庫啓動和運行起來。

若是你打算用一種數據庫瀏覽工具,我推薦使用命令行程序 psql - 它與 PostgreSQL 服務器安裝程序綁在一塊兒。這裏有一個小速查表,若是你開始用 PostgreSQL,這玩意早晚會派上用場。

若是不喜歡命令行界面,能夠用開源的 PostgreSQL 管理圖形界面工具 pgAdmin

注意,SQL 自己就是一門語言,咱們不會講解它全部功能,只會說起最簡單的。要了解更多的關於 SQL 的知識,這裏有很多講解 PostgreSQL 基礎知識的課程都還不錯。

Node.js 數據庫交互

首先,得建立要使用的數據庫。爲此,在終端中鍵入以下命令:

createdb node_hero

而後,建立用戶表:

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

最後,回到編碼。以下是經過 Node.js 程序與數據交互的代碼:

'use strict'

const pg = require('pg')  
const conString = 'postgres://username:password@localhost/node_hero' // 確保要匹配你本身數據庫的憑據

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' 示例。注意第一個參數是 SQL 命令字符串,第二個參數是給查詢提供的參數值數組。

若是就按用戶輸入插入到數據庫,會有很大的安全問題。這種方式能夠防止 SQL 注入式攻擊,這種類型的攻擊是攻擊者試圖利用徹底未處理的 SQL 查詢。在建立任何面向用戶的應用程序時,必須總要考慮這種狀況。要學習更多關於 SQL 安全性的知識,請查看咱們的 Node.js 應用程序安全備忘錄

下面繼續前一示例。

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 回調會通知 pg 驅動程序鏈接能夠被關閉,或者返回給鏈接緩衝池

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

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

完成解鎖:用戶存儲在數據庫中!:) 如今咱們試着獲取他們。下一步,爲用戶獲取給應用程序添加一個新的端點。

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)
    })
  })
})

也不算很難,對吧?

如今你能夠運行提供給 Node.js 應用程序的任何複雜 SQL 查詢。

使用這種技術,你能夠將數據永久存儲在應用程序中,多虧了 Node-postgreSQL 模塊團隊的辛勤勞動,使存儲數據變得易如反掌。

咱們已經完成了在 Nodejs 中使用數據庫所必須知道的全部基礎知識。如今本身去建立一些東西好了。

嘗試、實驗,由於這是稱爲一個真正的 Node 勇士的最佳方式。實踐並準備下一章若是與第三方 API 通信

若是你有任何有本教程相關的或者與在 Node.js 中使用數據庫的問題,只管提出來!

圖片描述

相關文章
相關標籤/搜索