目录
什么是 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)

前端热敏纸小票打印遇到乱码问题怎么办? 前端热敏纸小票打印遇到乱码问题怎么办? Apr 04, 2025 pm 02:42 PM

前端热敏纸小票打印的常见问题与解决方案在前端开发中,小票打印是一个常见的需求。然而,很多开发者在实...

神秘的JavaScript:它的作用以及为什么重要 神秘的JavaScript:它的作用以及为什么重要 Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

谁得到更多的Python或JavaScript? 谁得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

如何实现视差滚动和元素动画效果,像资生堂官网那样?
或者:
怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? 如何实现视差滚动和元素动画效果,像资生堂官网那样? 或者: 怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? Apr 04, 2025 pm 05:36 PM

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript难以学习吗? JavaScript难以学习吗? Apr 03, 2025 am 12:20 AM

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

JavaScript的演变:当前的趋势和未来前景 JavaScript的演变:当前的趋势和未来前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? 如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

Zustand异步操作:如何确保useStore获取的最新状态? Zustand异步操作:如何确保useStore获取的最新状态? Apr 04, 2025 pm 02:09 PM

zustand异步操作中的数据更新问题在使用zustand状态管理库时,经常会遇到异步操作导致数据更新不及时的问题。�...

See all articles