knex的自定义功能

时间:2015-12-05 06:23:53

标签: bookshelf.js knex.js

我一直在做很多操作,我希望有一种方法可以“扩展”knex以便能够做到。

我想要像:

oneExists
    result = knex.count(id).from('table').where({'code': 25})
    if (result.length === 0) return false
    if (result.length === 1) return true
    throw an error

我希望能够做类似

的事情
knex.oneExists.count('id').from('table').where({'code': 25}).

目前我正在写这样的代码:

KnexUtil.oneExists(knex.select('id').from('table').where({code: 25})) 

返回一个承诺

我查看了knex代码库,我不确定:

  1. 如何链接(以及我是否会在/lib/query/compiler.js中执行此操作)
  2. 如何只对knex进行扩展,以便我不需要修改原始代码库

3 个答案:

答案 0 :(得分:2)

当然可以。我建议只创建自己的插件,如下所示:

// my-plugin.js
'use strict';

module.exports = function (Bookshelf) {
    Bookshelf.Model = Bookshelf.Model.extend({
        foo: function ( bar ) {
            if( bar )
                console.log('Method foo was called on a model with the arguments:', arguments.join(', '));
        }
    });

    Bookshelf.Collection = Bookshelf.Collection.extend({
        foo: function ( bar ) {
            if( bar )
                console.log('Method foo was called on a collection with the arguments:', arguments.join(', '));
        }
    });
};

然后在主应用程序文件中添加:

Bookshelf.plugin( require( './my-plugin' ) );

BookshelfJS插件基本上允许您扩展模型和集合(以及更多),这允许您添加自己的方法,或覆盖现有方法(同时仍然能够从插件中调用原始方法)

为了更好地理解,您可能会在plugins directory内查看一些现有的BookshelfJS插件,其中一些已经附带书架。

另一个可能更好地了解插件工作方式的插件是Soft Delete Plugin。在该插件中,您可以看到一些BookshelfJS方法在模型和集合对象中是如何被覆盖的,方法是执行方法的原始版本,然后返回解析/修改的结果(Lines #37-#59和{{3 }},以及添加全新的方法(Lines #37-#57

编辑:显然这比KnexJS更多是BookshelfJS,但我没有看到为KnexJS创建插件的任何方法,因为它只是一个查询构造函数,所有真实的魔法在ORM中

答案 1 :(得分:2)

从v0.19.1开始,knex具有扩展QueryBuilder的内置功能

import Knex from 'knex'
Knex.QueryBuilder.extend('someFn', function (arg) {
  console.log('Do Smth', arg)
  return this
})
const knex = Knex({ client: 'pg' })
knex.select().from('table').someFn(0).toString()

答案 2 :(得分:0)

https://github.com/tgriesser/knex/issues/1158

中对此进行了讨论

knex并不支持这一点,但是一个hacky方法就是使用你的函数来修补knex查询构建器:

var knex = require('knex')({client: 'pg'});
knex.client.QueryBuilder.prototype.newFunc = function () { 
  console.log("New query builder function"); 
  return this; 
}
knex('table').newFunc().toString();
// outputs: 
// New query builder function
// 'select * from "table"'