bookshelf.js_Bookshelf.js入门

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.jsSequelize.jsBookshelf.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值