Bookshelf.knex不是一个函数错误

将Bookshelf和Knex集成到我的堆栈有一些麻烦。 当试图执行数据库读/写,我得到一个TypeError:knex不是一个函数。

我的bookshelf.js:

'use strict' var knex = require('knex')(require('./knexfile')).debug(true); var bookshelf = require('bookshelf')(knex); bookshelf.plugin('registry'); module.exports = bookshelf; 

我的god.model.js:

 var bookshelf = require('./bookshelf'); var God = bookshelf.Model.extend({ tableName: 'gods' }); module.exports = bookshelf.model('God', God); 

最后,获取数据的函数:

 var validate_key_secret = function(key, secret, callback) { God.where({apikey: key}).fetch().then(function(result) { if(result.attributes.apisecret === secret) { callback(results); } else { callback(false); } }); } 

调用该函数将引发以下错误:

在Object.query(D:\ Repositories \ knextest \ node_modules)中,TypeError:bookshelf.knex不是builderFn [作为_builder](D:\ Repositories \ knextest \ node_modules \ bookshelf \ lib \ bookshelf.js:314:27) (D:\ Repository \ knextest \ node_modules \ bookshelf \ lib \ model.js:1243:30)在(D:\ Repositories \ (匿名函数).Collection。(匿名函数)[as where](D:\ Repositories \ knextest \ node_modules \ bookshelf \ lib \ bookshelf.js:333) (D:\ Repositories \ knextest \ node_modules \ express \ lib)中的validate_key_secret(D:\ Repositories \ knextest \ app \ controllers \ gods.server.controller.js:114:3) (D:\ Repositories \ knextest \ node_modules \ express \ lib \ router \ route.js:131:13)在Route.dispatch(D:\ Repositories \ knextest \ node_modules)中的路由器\ router \ layer.js:95: \ express \ lib \ router \ route.js:112:3)在Layer.handle [作为handle_request](D:\ Repositories \ knextest \ node_mod 在D:\ Repositories \ knextest \ node_modules \ express \ lib \ router \ index.js:277:22位于Function.process_params(D:\ Repositories \ knextest)中的ules \ express \ lib \ router \ layer.js:95: (D:\ Repositories \ knextest \ node_modules \ express \ lib \ router \ index.js:271:10)在SessionStrategy.strategy.pass(\ node_modules \ express \ lib \ router \ index.js: 330:12) D:\ Repositories \ knextest \ node_modules \ passport \ lib \ strategies \ session.js:71:10 )

我到目前为止所尝试的是:

1)调查bookshelf.js节点模块。 错误发生在./node_modules/bookshelf/lib/bookshelf.js第314行:

 builder = bookshelf.knex(tableNameOrBuilder); 

当我改变线路,

 builder = bookshelf.knex.select().from(tableNameOrBuilder); 

我能够执行简单的SQL读取和写入。 但是,这开始导致更复杂的查询问题,我认为编辑节点模块通常不是一个好的做法。 但是,这样做可以排除任何可能的问题与我的knexfile /数据库configuration。

2)在循环依赖错误的情况下集成bookshelf.plug('registry')

3)检查knex文档。 Knex(表名)是查询生成器的一部分,应该工作。 所以我补充说,

 knex('gods'); 

到我的bookshelf.js文件的结尾,它扔了一个类似的,[knex不是一个函数]的错误。

我认为这个问题可能是knex模块被不正确的加载,但我不知道如何检查是否是这种情况。 目前,我有点难住。

道歉,如果上面的东西不清楚,我仍然是相当新的节点和JavaScript的发展,并很乐意提供任何其他信息,这将有助于解决这个问题。

谢谢!

编辑:

Knexfile.js:

 module.exports = { client: 'pg', connection: { host: '<my cloud host [redacted]>', user: process.env.DBUSER, password: process.env.DBPASSWORD, database: '<my db name [redacted]>' } }; 

这一个是棘手的。 这个问题是由.debug(true) knex调用引起的, 它不返回一个knex实例。 所以把bookshelf.js改成

 'use strict' var knex = require('knex')(require('./knexfile')); knex.debug(true); var bookshelf = require('bookshelf')(knex); bookshelf.plugin('registry'); module.exports = bookshelf; 

而不是这样强制debugging模式,它可能会更好地设置它从knex连接string,如:

 { client: 'pg', connection: { host: '<my cloud host [redacted]>', user: process.env.DBUSER, password: process.env.DBPASSWORD, database: '<my db name [redacted]>' }, debug: true }