核心要点
近年来,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中文网其他相关文章!