簡體   English   中英

Bookshelf.knex不是函數錯誤

[英]Bookshelf.knex is not a function error

將Bookshelf和Knex集成到我的堆棧中有些麻煩。 嘗試執行db read / write時,我得到一個TypeError:knex不是函數。

我的書架.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不是在Object.query(D:\\ Repositories \\ knextest \\ node_modules)的builderFn [as _builder](D:\\ Repositories \\ knextest \\ node_modules \\ bookshelf \\ lib \\ bookshelf.js:314:27)中的函數\\ bookshelf \\ lib \\ helpers.js:44:23)查詢(D:\\ Repositories \\ knextest \\ node_modules \\ bookshelf \\ lib \\ model.js:1243:30)at(D:\\ Repositories \\ knextest \\ node_modules \\ bookshelf) \\ lib \\ model.js:1278:23)在Function.Model。(匿名函數).Collection。(匿名函數)[如何](D:\\ Repositories \\ knextest \\ node_modules \\ bookshelf \\ lib \\ bookshelf.js:333 :28)在Layer.handle的validate_key_secret(D:\\ Repositories \\ knextest \\ app \\ controllers \\ gods.server.controller.js:114:3)[作為handle_request](D:\\ Repositories \\ knextest \\ node_modules \\ express \\ lib) \\ router \\ layer.js:95:5)在Route.dispatch的下一個(D:\\ Repositories \\ knextest \\ node_modules \\ express \\ lib \\ router \\ route.js:131:13)(D:\\ Repositories \\ knextest \\ node_modules) \\ express \\ lib \\ router \\ route.js:112:3)在Layer.handle [as handle_request](D:\\ Repositories \\ knextest \\ node_mod ules \\ express \\ lib \\ router \\ layer.js:95:5)在D:\\ Repositories \\ knextest \\ node_modules \\ express \\ lib \\ router \\ index.js:277:22 at Function.process_params(D:\\ Repositories \\ knextest)在SessionStrategy.strategy.pass上的\\ node_modules \\ express \\ lib \\ router \\ index.js:330:12)下一步(D:\\ Repositories \\ knextest \\ node_modules \\ express \\ lib \\ router \\ index.js:271:10) D:\\ Repositories \\ knextest \\ node_modules \\ passport \\ lib \\ middleware \\ authenticate.js:325:9)在SessionStrategy.authenticate(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 / 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]>' 
    } 
};

這個很棘手。 該問題是由.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;

而不是以這種方式強制調試模式,也可以更好地從knex連接字符串設置它,如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM