核心要點
近年來,JavaScript 的流行度激增。多年來,人們多次嘗試將這種流行的語言應用於服務器端。其中最成功的一次嘗試是 Node.js,它被推薦給社區作為一種快速編寫服務器應用程序的方法。 Node 的賣點是速度,無論是在性能方面還是在開發時間方面。憑藉這種流行度,社區不斷壯大,該項目也受益於更多貢獻者,從而產生了諸如 Express.js 之類的高質量模塊。
因此,人們開始使用 Node 構建完整的後端。後端系統應該做的最重要的事情之一就是有效地與數據庫通信。這就是對象關係映射 (ORM) 軟件的用武之地。通常,開發人員需要精通他們正在使用的編程語言和 SQL 才能與數據庫通信。 ORM 通過允許開發人員使用他們選擇的編程語言中的對象與數據庫交互來簡化開發過程。本文介紹了 ORM,並特別關注 Bookshelf.js ORM。
什麼是 ORM?
維基百科將對象關係映射定義為:
一種編程技術,用於在面向對象的編程語言中轉換不兼容類型系統之間的數據。這實際上創建了一個“虛擬對像數據庫”,可以在編程語言內部使用。
在我們的例子中,編程語言是 JavaScript,不兼容的系統是關係數據庫系統,例如 MySQL。這意味著 ORM 庫應該允許我們以與交互常規 JavaScript 對象相同的方式與數據庫通信。 Node.js 存在許多 ORM 庫,流行的庫包括 Persistence.js、Sequelize.js 和 Bookshelf.js。本文將介紹 Bookshelf.js。
Bookshelf.js 示例
數據庫交互通常圍繞四個 CRUD 操作展開——創建、讀取、更新和刪除。 Bookshelf.js 提供了一種直觀的方式來執行這些操作,例如,創建操作如下所示:
new Post({name: 'New Article'}).save().then(function(model) { // ... });
假設 Post 是一個模型,它具有相應的數據庫表,並且 name 是一個屬性,它對應於數據庫表中的一個列。
類似地,讀取操作如下所示:
new Post({name: 'New Article'}).save().then(function(model) { // ... });
請注意代碼中的 then 調用。 Bookshelf.js 支持基於 Promise 的接口,在這種情況下,這意味著只有在查詢成功時才會調用傳遞給 then 的匿名函數。模型是生成的 JavaScript 對象,您可以使用它來訪問與 User 關聯的屬性。在我們的例子中,model.get('gender') 返回用戶的性別。
使用 Bookshelf.js 和 Express.js 構建 API
對於更完整的示例,假設我們被委託構建一個具有以下資源的博客 JSON API:
// select * from `user` where `email` = 'user@mail.com' new User({email: 'user@mail.com'}) .fetch() .then(function(model) { console.log(model.get('gender')); });
並且客戶端已經擁有以下表:
<code>GET /api/article GET /api/article/:article_id POST /api/article</code>
首先,我們需要使用 package.json 設置 Express.js 環境:
create table article ( id int not null primary key, title varchar(100) null, body text null, author varchar(100) null );
我們需要 knex 查詢構建器,因為 bookshelf 依賴於它,並且我們需要 bluebird 來處理 Promise。我們的 app.js 結構如下所示:
{ "name": "article_api", "description": "expose articles via JSON", "version": "0.0.1", "private": true, "dependencies": { "bluebird": "^2.1.3", "body-parser": "^1.3.1", "express": "4.4.3", "mysql": "*", "knex": "*", "bookshelf": "*" } }
我們的 MySQL 數據庫名為 blog。我們需要定義 article 模型並將其綁定到 article 表。我們將用以下內容替換 // {我們的模型定義代碼在這裡}:
// 当应用程序启动时 var express = require('express'); var app = express(); var bodyParser = require('body-parser'); var Promise = require('bluebird'); var dbConfig = { client: 'mysql', connection: { host: 'localhost', user: 'root', password: 'your_password', database: 'blog', charset: 'utf8' } }; var knex = require('knex')(dbConfig); var bookshelf = require('bookshelf')(knex); app.set('bookshelf', bookshelf); var allowCrossDomain = function(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); next(); }; app.use(allowCrossDomain); // 解析 application/x-www-form-urlencoded app.use(bodyParser.urlencoded()); // 解析 application/json app.use(bodyParser.json()); // 解析 application/vnd.api+json 为 json app.use(bodyParser.json({type: 'application/vnd.api+json'})); // 在其他地方,使用 bookshelf 客户端: var bookshelf = app.get('bookshelf'); // {我们的模型定义代码在这里} app.listen(3000, function() { console.log('Express started at port 3000'); });
毋庸置疑,這就是在 Bookshelf.js 中定義模型所需的一切。我們現在可以使用此模型在我們的 API 中查詢數據庫。首先,GET /api/article 方法應該返回數據庫中的所有文章:
var Article = bookshelf.Model.extend({ tableName: 'article' });
Bookshelf.js 中的 fetchAll 獲取數據庫表中的所有條目,只有在發生錯誤時才會執行 catch(文檔中還有更多模型方法)。
結論
Node.js 作為一項技術得到了發展,可以通過 Express.js 等模塊用於構建 Web 應用程序和 API。 Bookshelf.js 通過封裝底層數據庫表結構並公開常規 JavaScript 對像以進行查詢,使與 Node.js 應用程序的關係數據庫的交互更加容易。本文提供了高級介紹。演示項目的完整實現可在 GitHub 上找到。 (此處應添加GitHub鏈接,如果存在的話)
Bookshelf.js 入門常見問題解答
Bookshelf.js 是一個 JavaScript 庫,它提供了一個簡單優雅的 API 來與 SQL 數據庫進行交互。它支持事務、急切/嵌套急切關係加載、多態關聯等等。使用 Bookshelf.js 的主要優勢在於它的簡單性和靈活性。它允許您編寫更少的代碼同時做更多的事情,從而使您的開發過程更快更高效。
要安裝 Bookshelf.js,您需要在系統上安裝 Node.js 和 npm。安裝完畢後,您可以通過在終端中運行命令 npm install bookshelf knex sqlite3 --save
來安裝 Bookshelf.js。這將安裝 Bookshelf.js 以及 Knex.js(一個 SQL 查詢構建器)和 SQLite3(一個輕量級的基於磁盤的數據庫)。
要將 Bookshelf.js 連接到您的數據庫,您首先需要使用您的數據庫配置初始化 Knex.js。然後,您將此初始化的 Knex 實例傳遞給 Bookshelf.js。這是一個基本示例:
new Post({name: 'New Article'}).save().then(function(model) { // ... });
在 Bookshelf.js 中,模型是通過擴展 Bookshelf.js 提供的基類 Model 來定義的。這是一個定義 User 模型的示例:
// select * from `user` where `email` = 'user@mail.com' new User({email: 'user@mail.com'}) .fetch() .then(function(model) { console.log(model.get('gender')); });
使用 Bookshelf.js 從數據庫中提取數據非常簡單。您可以使用模型提供的 fetch 方法。這是一個示例:
<code>GET /api/article GET /api/article/:article_id POST /api/article</code>
使用 Bookshelf.js 將數據保存到數據庫也很簡單。您可以使用模型提供的 save 方法。這是一個示例:
create table article ( id int not null primary key, title varchar(100) null, body text null, author varchar(100) null );
可以使用 save 方法更新數據庫中的數據。您只需要先提取模型,然後使用新數據調用 save。這是一個示例:
{ "name": "article_api", "description": "expose articles via JSON", "version": "0.0.1", "private": true, "dependencies": { "bluebird": "^2.1.3", "body-parser": "^1.3.1", "express": "4.4.3", "mysql": "*", "knex": "*", "bookshelf": "*" } }
可以使用模型提供的 destroy 方法從數據庫中刪除數據。這是一個示例:
// 当应用程序启动时 var express = require('express'); var app = express(); var bodyParser = require('body-parser'); var Promise = require('bluebird'); var dbConfig = { client: 'mysql', connection: { host: 'localhost', user: 'root', password: 'your_password', database: 'blog', charset: 'utf8' } }; var knex = require('knex')(dbConfig); var bookshelf = require('bookshelf')(knex); app.set('bookshelf', bookshelf); var allowCrossDomain = function(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); next(); }; app.use(allowCrossDomain); // 解析 application/x-www-form-urlencoded app.use(bodyParser.urlencoded()); // 解析 application/json app.use(bodyParser.json()); // 解析 application/vnd.api+json 为 json app.use(bodyParser.json({type: 'application/vnd.api+json'})); // 在其他地方,使用 bookshelf 客户端: var bookshelf = app.get('bookshelf'); // {我们的模型定义代码在这里} app.listen(3000, function() { console.log('Express started at port 3000'); });
Bookshelf.js 提供了幾種方法來處理模型之間的關係,例如 hasOne、hasMany、belongsTo 和 belongsToMany。這是一個具有多個 Post 模型的 User 模型示例:
var Article = bookshelf.Model.extend({ tableName: 'article' });
Bookshelf.js 中的事務可以使用 Knex.js 提供的 transaction 方法來處理。這是一個示例:
app.get('/api/article', function(req, res) { new Article().fetchAll() .then(function(articles) { res.send(articles.toJSON()); }).catch(function(error) { console.log(error); res.send('An error occured'); }); });
請注意,以上代碼示例中的一些細節可能需要根據您的具體數據庫和環境進行調整。 此外,建議參考Bookshelf.js的官方文檔獲取最新的信息和更詳細的指導。
以上是bookshelf.js入門的詳細內容。更多資訊請關注PHP中文網其他相關文章!