本文轉載自:衆成翻譯
譯者:網絡埋伏紀事
連接: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 有幾種風格,但基本原理都是相同。
數據自己會被存儲在表中,每一個插入的塊將會被表示爲表中的一行,就像 Google Sheets 或者 Microsoft Excel 中的同樣。
在一個 SQL 數據庫中,你能夠定義 schema - 這些 schema 會爲你要放進去的數據提供一個骨架。在存儲數據以前,必須設置不一樣值的類型。例如,必須爲用戶數據定義一個表,必須告訴數據庫用戶名是字符串類型,年齡是整型。
另外一方面,NoSQL 數據庫在最近十年變得至關流行。若是使用 NoSQL,就不須要定義 schema,能夠存儲任意 JSON。這對 JavaScript 很方便,由於在 JavaScript 中將對象轉換爲 JSON 很容易。不過,使用 NoSQL 要小心,由於它沒法保證數據的一致性,也沒法知道數據庫中存的是什麼。
咱們總會聽到對 Node.js 的一個常見誤解:
"Node.js 只能用 MongoDB( MongoDB 是最流行的 NoSQL 數據庫)。"
根據個人經驗,這是不正確的。大多數數據庫都有驅動程序能夠用,它們在 NPM 上也有庫。據我看,它們與 MongoDB 同樣簡單易用。
爲簡單起見,咱們打算在下面的示例中使用 SQL。我選擇的是 PostgreSQL。
要讓 PostgreSQL 啓動和運行,必須將它安裝到你的電腦上。若是是 Mac,就用 homebrew 安裝 PostgreSQL。另外,若是是 Linux,就用你用的包管理器安裝它。
進一步的信息請閱讀這篇優秀的指南,讓你的第一個數據庫啓動和運行起來。
若是你打算用一種數據庫瀏覽工具,我推薦使用命令行程序 psql
- 它與 PostgreSQL 服務器安裝程序綁在一塊兒。這裏有一個小速查表,若是你開始用 PostgreSQL,這玩意早晚會派上用場。
若是不喜歡命令行界面,能夠用開源的 PostgreSQL 管理圖形界面工具 pgAdmin。
注意,SQL 自己就是一門語言,咱們不會講解它全部功能,只會說起最簡單的。要了解更多的關於 SQL 的知識,這裏有很多講解 PostgreSQL 基礎知識的課程都還不錯。
首先,得建立要使用的數據庫。爲此,在終端中鍵入以下命令:
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 中使用數據庫的問題,只管提出來!