bookshelf.js
在过去的三年中,我们看到了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
是与数据库表中的列相对应的属性。
同样,读取操作如下所示:
// select * from `user` where `email` = 'user@mail.com'
new User({email: 'user@mail.com'})
.fetch()
.then(function(model) {
console.log(model.get('gender'));
});
注意代码中的then
调用。 Bookshelf.js支持的承诺为基础的接口,在这种情况下意味着传入匿名函数, then
如果查询成功,才会被调用。 该model
是生成JavaScript对象,可用于访问与User
关联的属性。 在我们的例子中, model.get('gender')
返回用户的性别。
使用Bookshelf.js和Express.js构建API
对于更完整的示例,假设我们被委托使用以下资源为博客构建JSON API:
GET /api/article
GET /api/article/:article_id
POST /api/article
并且,客户端已经具有带有下表MySQL数据库:
create table article (
id int not null primary key,
title varchar(100) null,
body text null,
author varchar(100) null
);
首先,我们需要使用package.json
设置Express.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": "*"
}
}
我们需要knex
查询生成器,因为bookshelf
依赖knex
,并且我们需要bluebird
来保证。
我们的app.js
结构现在看起来像这样:
// When the app starts
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);
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded());
// parse application/json
app.use(bodyParser.json());
// parse application/vnd.api+json as json
app.use(bodyParser.json({type: 'application/vnd.api+json'}));
// elsewhere, to use the bookshelf client:
var bookshelf = app.get('bookshelf');
// {our model definition code goes here}
app.listen(3000, function() {
console.log('Express started at port 3000');
});
我们MySQL数据库称为blog
。 我们需要定义文章模型,并将其绑在article
表。 我们将// {our model definition code goes here}
替换为:
var Article = bookshelf.Model.extend({
tableName: 'article'
});
信不信由你,这就是在Bookshelf.js中定义模型所需的全部。 现在,我们可以使用此模型在API中查询数据库。 首先, GET /api/article
方法应返回数据库中的所有文章:
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中的fetchAll
获取数据库表中的所有条目,并且仅在发生错误时执行catch
(文档中包含更多模型方法)。
结论
Node.js已经发展成为一种技术,可以通过Express.js等模块用于构建Web应用程序和API。 通过包装基础数据库表结构并公开常规JavaScript对象以进行查询,Bookshelf.js使得通过Node.js应用程序与关系数据库进行对话变得更加容易。 本文提供了高层次的介绍。 可以在GitHub上获得演示项目的完整实现。
翻译自: https://www.sitepoint.com/getting-started-bookshelf-js/
bookshelf.js