摘要:是一種設計用于關系型數據庫的查詢語言。另一方面,數據庫在最近十年變得相當流行。大多數數據庫都有驅動程序可以用,它們在上也有庫。我們已經完成了在中使用數據庫所必須知道的所有基礎知識。
本文轉載自:眾成翻譯
譯者:網絡埋伏紀事
鏈接:http://www.zcfy.cc/article/1751
原文:https://blog.risingstack.com/node-js-database-tutorial/
如下的 Node.js 數據庫教程將展示如何設置 Node.js 應用程序的數據庫,并且教你使用它的基礎知識。
將數據存儲在一個全局變量中正如在上章所學,為用戶提供靜態(tài)頁面,可能適合著陸頁或者個人博客。但是,如果想交付個性化的內容,就必須將數據存在某個地方。
舉個例子:用戶注冊。可以為個別用戶提供定制內容,或者只讓它在用戶通過身份驗證后可用。
如果用戶想注冊你的應用程序,你可能想創(chuàng)建一個路由處理器來讓他注冊成功:
const users = [] app.post("/users", function (req, res) { // 從請求消息體中獲取用戶發(fā)送的數據 const user = req.body users.push({ name: user.name, age: user.age }) res.send("注冊成功!") })
通過這種方式,可以把用戶存儲在一個全局變量中,這個全局變量在應用程序生命周期都會駐留在內存中。
使用這種方式會因為幾個原因而帶來問題:
內存很貴,
每次重新啟動應用程序時,內存都會重置,
如果不清理的話,有時候會遇到棧溢出。
將數據存儲在文件中出現在你腦海中的下一件事情可能是將數據存儲在文件中。
如果把用戶數據永久性地存儲在文件系統(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("注冊成功!") }) })
這種方式我們不會丟失用戶數據,即使服務器重啟后也不會。這種解決方案也是經濟有效的,因為買存儲空間比買內存更便宜。
不幸的是,用這種方式存儲用戶數據依然有幾個缺陷:
添加用戶數據是可以的,但是想想更新或者刪除。
如果是存到文件,并行訪問文件就沒那么容易了(系統(tǒng)級鎖會阻止寫數據)。
當擴展應用程序時,沒法把文件分割放在服務器之間(可以,但是方法超出了本教程的等級)。
這就是真實數據庫起作用的地方。
你可能已經聽說過數據庫有兩種主要類型: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,就用你用的包管理器安裝它。
進一步的信息請閱讀這篇優(yōu)秀的指南,讓你的第一個數據庫啟動和運行起來。
如果你打算用一種數據庫瀏覽工具,我推薦使用命令行程序 psql - 它與 PostgreSQL 服務器安裝程序綁在一起。這里有一個小速查表,如果你開始用 PostgreSQL,這玩意遲早會派上用場。
如果不喜歡命令行界面,可以用開源的 PostgreSQL 管理圖形界面工具 pgAdmin。
注意,SQL 本身就是一門語言,我們不會講解它所有功能,只會提及最簡單的。要了解更多的關于 SQL 的知識,這里有不少講解 PostgreSQL 基礎知識的課程都還不錯。
Node.js 數據庫交互首先,得創(chuàng)建要使用的數據庫。為此,在終端中鍵入如下命令:
createdb node_hero
然后,創(chuàng)建用戶表:
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 查詢。在創(chuàng)建任何面向用戶的應用程序時,必須總要考慮這種情況。要學習更多關于 SQL 安全性的知識,請查看我們的 Node.js 應用程序安全備忘錄。
下面繼續(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 回調會通知 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 中使用數據庫所必須知道的所有基礎知識?,F在自己去創(chuàng)建一些東西好了。
嘗試、實驗,因為這是稱為一個真正的 Node 勇士的最佳方式。實踐并準備下一章如果與第三方 API 通訊!
如果你有任何有本教程相關的或者與在 Node.js 中使用數據庫的問題,只管提出來!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/84979.html
摘要:使用一個事件驅動的非阻塞式的模型,讓它輕量而高效。也就是說提供了用編寫服務器的可能性,這種服務器具有令人難以置信的性能。正如官方聲明所說是一個使用與瀏覽器相同引擎的運行時。這意味著有兩個發(fā)布版本穩(wěn)定版和試驗版。 本文轉載自:眾成翻譯譯者:網絡埋伏紀事鏈接:http://www.zcfy.cc/article/1748原文:https://blog.risingstack.com/nod...
摘要:本文轉載自眾成翻譯譯者網絡埋伏紀事鏈接原文本教程中將學習如何使用和實現一個本地身份驗證策略。我們將有一個用戶頁,一個備注頁,和一些與身份驗證相關的功能。下一步下一章主要涉及應用程序的單元測試。你會學習單元測試測試金字塔測試替代等概念。 本文轉載自:眾成翻譯譯者:網絡埋伏紀事鏈接:http://www.zcfy.cc/article/1755原文:https://blog.risings...
摘要:本教程會學習如何正確組織一個項目的結構,從而在應用程序開始增長時避免混亂。項目結構的五個基本規(guī)則組織項目有不少可能的方式并且每種已知的方式都有其興衰。過去在,我們有機會創(chuàng)建各種規(guī)模的高效應用程序,也獲得了大量關于項目結構注意事項的見解。 本文轉載自:眾成翻譯譯者:網絡埋伏紀事鏈接:http://www.zcfy.cc/article/1756原文:https://blog.rising...
摘要:狀態(tài)碼描述了請求的結果,它對錯誤處理是必不可少的。響應還沒完成成功這些狀態(tài)碼表示請求被接收并正確處理了。服務器錯誤當服務器由于某些錯誤不能完成有效的請求時,就發(fā)送這些狀態(tài)碼。 本文轉載自:眾成翻譯譯者:網絡埋伏紀事鏈接:http://www.zcfy.cc/article/1758原文:https://blog.risingstack.com/node-hero-node-js-req...
摘要:基本上,測試金字塔描述你應該編寫單元測試集成測試和端到端測試。集成測試要比端到端測試多,單元測試甚至要更多一些。應用程序單元測試編寫單元測試,是為了看看給定的模塊單元是否工作。 本文轉載自:眾成翻譯譯者:網絡埋伏紀事鏈接:http://www.zcfy.cc/article/1754原文:https://blog.risingstack.com/node-hero-node-js-un...
閱讀 3440·2023-04-25 19:42
閱讀 1457·2021-11-23 10:11
閱讀 2436·2021-11-16 11:51
閱讀 1662·2019-08-30 15:54
閱讀 2116·2019-08-29 18:44
閱讀 1722·2019-08-23 18:24
閱讀 548·2019-08-23 17:52
閱讀 1857·2019-08-23 15:33