2017-02-28 79 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 
}