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 }