2017-02-28 76 views
2

在将Bookshelf和Knex集成到我的堆栈时遇到了一些麻烦。当试图执行数据库读/写,我得到一个TypeError:knex不是一个函数。Bookshelf.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); 
     } 
    }); 
} 

调用函数引发以下错误:

TypeError:bookshelf.knex不是函数 at builderFn [as _builder](D:\ Repositories \ knextest \ node_modules \ bookshelf \ lib \ bookshelf.js:314:27) at Object.query(D:\ Repositories \ (D:\ Repositories \ knextest \ node_modules \ bookshelf \ lib \ model.js:1243:30) at where(D:\ Repositories \ (匿名函数).Collection(匿名函数)[as where](D:\ Repositories \ knextest \ node_modules \ bookshelf \ lib) \ bookshelf.js:333:28) at validate_key_secret(D:\ Repositories \ knextest \ app \ controllers \ gods.server.controller.js:114:3) at Layer.handle [as handle_request](D:\ Repositories \ knextest \ node_modules \表现\ LIB \路由器\层(D:\ Repositories \ knextest \ node_modules \ express \ lib \ router \ route.js:131:13) at Route.dispatch(D:\ Repositories \ knextest \ node_modules \ express).js:95:5) (D:\ Repositories \ knextest \ node_modules \ express \ lib \ router \ layer.js:95:5) at D:\ lib \ router \ route.js:112:3) at Layer.handle [as handle_request] \ Repositories \ knextest \ node_modules \ express \ lib \ router \ index.js:277:22 at Function.process_params(D:\ Repositories \ knextest \ node_modules \ express \ lib \ router \ index.js:330:12) (D:\ Repositories \ knextest \ node_modules \ express \ lib \ router \ index.js:271:10) at SessionStrategy.strategy.pass(D:\ Repositories \ knextest \ node_modules \ passport \ lib \ middleware \ authenticate .js:325:9) at SessionStrategy.authenticate(D:\ Repositories \ knextest \ node _modules \护照\ LIB \策略\ 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/db配置可能出现的任何问题。

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

3)检查knex文档。 Knex(tablename)是查询生成器的一部分,应该工作。所以我添加,

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]>' 
    } 
}; 
+0

可以添加你knexfile请? – paqash

+0

当然!添加到原始文章 – abhuptani

回答

0

这一次是棘手。该问题是由 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; 

,而不是强制调试模式的这种方式可能是也更好地从knex设置连接字符串,如:

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