目錄
什麼是 Bookshelf.js,為什麼我應該使用它?
如何安裝 Bookshelf.js?
如何將 Bookshelf.js 連接到我的數據庫?
如何在 Bookshelf.js 中定義模型?
如何使用 Bookshelf.js 從數據庫中提取數據?
如何使用 Bookshelf.js 將數據保存到數據庫?
如何使用 Bookshelf.js 更新數據庫中的數據?
如何使用 Bookshelf.js 從數據庫中刪除數據?
如何在 Bookshelf.js 中處理關係?
如何在 Bookshelf.js 中處理事務?
首頁 web前端 js教程 bookshelf.js入門

bookshelf.js入門

Feb 21, 2025 am 10:13 AM

Getting Started with Bookshelf.js

核心要點

  • Bookshelf.js 是一個針對JavaScript(特別是Node.js)的對象關係映射(ORM) 軟件,它通過允許開發者使用他們選擇的編程語言中的對象與數據庫交互來簡化與數據庫通信的過程。
  • 該庫提供了一種簡單直觀的方式來執行 CRUD(創建、讀取、更新、刪除)操作,並支持基於 Promise 的接口,這意味著只有在查詢成功時才會調用函數。
  • 如文中創建博客 JSON API 的示例所示,Bookshelf.js 可與 Express.js 結合使用來構建 API,並可用於封裝底層數據庫表結構,公開常規 JavaScript 對像以進行查詢。

近年來,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,為什麼我應該使用它?

Bookshelf.js 是一個 JavaScript 庫,它提供了一個簡單優雅的 API 來與 SQL 數據庫進行交互。它支持事務、急切/嵌套急切關係加載、多態關聯等等。使用 Bookshelf.js 的主要優勢在於它的簡單性和靈活性。它允許您編寫更少的代碼同時做更多的事情,從而使您的開發過程更快更高效。

如何安裝 Bookshelf.js?

要安裝 Bookshelf.js,您需要在系統上安裝 Node.js 和 npm。安裝完畢後,您可以通過在終端中運行命令 npm install bookshelf knex sqlite3 --save 來安裝 Bookshelf.js。這將安裝 Bookshelf.js 以及 Knex.js(一個 SQL 查詢構建器)和 SQLite3(一個輕量級的基於磁盤的數據庫)。

如何將 Bookshelf.js 連接到我的數據庫?

要將 Bookshelf.js 連接到您的數據庫,您首先需要使用您的數據庫配置初始化 Knex.js。然後,您將此初始化的 Knex 實例傳遞給 Bookshelf.js。這是一個基本示例:

new Post({name: 'New Article'}).save().then(function(model) {
  // ...
});
登入後複製
登入後複製
登入後複製

如何在 Bookshelf.js 中定義模型?

在 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 從數據庫中提取數據?

使用 Bookshelf.js 從數據庫中提取數據非常簡單。您可以使用模型提供的 fetch 方法。這是一個示例:

<code>GET  /api/article
GET  /api/article/:article_id
POST /api/article</code>
登入後複製
登入後複製

如何使用 Bookshelf.js 將數據保存到數據庫?

使用 Bookshelf.js 將數據保存到數據庫也很簡單。您可以使用模型提供的 save 方法。這是一個示例:

create table article (
  id int not null primary key,
  title varchar(100) null,
  body text null,
  author varchar(100) null
);
登入後複製
登入後複製

如何使用 Bookshelf.js 更新數據庫中的數據?

可以使用 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": "*"
  }
}
登入後複製
登入後複製

如何使用 Bookshelf.js 從數據庫中刪除數據?

可以使用模型提供的 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 中處理關係?

Bookshelf.js 提供了幾種方法來處理模型之間的關係,例如 hasOne、hasMany、belongsTo 和 belongsToMany。這是一個具有多個 Post 模型的 User 模型示例:

var Article = bookshelf.Model.extend({
  tableName: 'article'
});
登入後複製
登入後複製

如何在 Bookshelf.js 中處理事務?

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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1657
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1230
24
神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript引擎:比較實施 JavaScript引擎:比較實施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript:探索網絡語言的多功能性 JavaScript:探索網絡語言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

如何使用Next.js(前端集成)構建多租戶SaaS應用程序 如何使用Next.js(前端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

從C/C到JavaScript:所有工作方式 從C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

使用Next.js(後端集成)構建多租戶SaaS應用程序 使用Next.js(後端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

See all articles