2017-02-28 1 views
2

Bookhelf와 Knex를 스택에 통합하는 데 약간의 문제가 있습니다. db 읽기/쓰기를 시도 할 때 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가 Object.query (D : \ Repositories \ lib 디렉토리)에 의 builderFn에있는 D : \ Repositories \ Knextest \ node_modules \ bookshelf \ lib \ bookshelf.js : 314 : 27의 입니다. (D : \ Repositories \ knestest \ node_modules \ bookshelf \ lib \ model.js : 1243 : 30) 위치 : (익명 함수) .Collection. (익명 함수) [where where] (D : \ Repositories \ knextest \ node_modules \ bookshelf \ lib) (D : \ Repositories \ knextest \ app \ controllers \ gods.server.controller.js : 114 : 3) at Layer.handle [handle_request] (D : \ Repositories (\ bookshelf.js : 333 : 28) ) \ knextest \ node_modules \ express \ lib \ router \ layer Route.dispatch (D : \ Repositories \ knextest \ node_modules \ express)에서 다음 (D : \ Repositories \ knextest \ node_modules \ express \ lib \ router \ route.js : 131 : 13) D : \ Repositories \ Knextest \ node_modules \ express \ lib \ router \ layer.js : 95 : 5)에서 의 D : \ lib \ router \ route.js : Function.process_params (D : \ Repositories \ knextest \ node_modules \ express \ lib \ router \ index.js : 330 : 12)에서 \ Repositories \ knextest \ node_modules \ express \ lib \ router \ index.js : 277 : 22 SessionStrategy.strategy.pass (D : \ Repositories \ knextest \ node_modules \ passport \ lib \ middleware \ authenticate)의 다음 (D : \ Repositories \ knextest \ node_modules \ express \ lib \ router \ index.js : 271 : 10) .js : 325 : 9) at SessionStrategy.authenticate (D : \ Repositories \ knextest \ node _modules \ 여권 \ lib 디렉토리의 \ 전략 \ session.js : 10) 내가 지금까지 시도했습니다 무엇

: 71 bookshelf.js 노드 모듈을 조사

1).

내가 간단한 SQL을 수행 할 수 있어요
builder = bookshelf.knex.select().from(tableNameOrBuilder); 

읽기 및 쓰기

builder = bookshelf.knex(tableNameOrBuilder); 

나는 라인을 변경

: 오류 314 ./node_modules/bookshelf/lib/bookshelf.js 라인에서 발생 . 그러나 이것은보다 복잡한 질의에 문제를 야기하기 시작하고 노드 모듈을 편집하는 것이 일반적으로 좋지 않은 방법이라고 생각합니다. 그러나이 작업을 수행하면 knexfile/db 구성에서 발생할 수있는 문제를 배제 할 수 있습니다.

2) 순환 종속성 오류의 경우 bookshelf.plug('registry')을 통합합니다.

3) knex 문서 확인. Knex (tablename)는 쿼리 작성기의 일부이므로 작동해야합니다.그래서 난 내 bookshelf.js 파일의 끝에,

knex('gods'); 

을 추가하며 유사한 오류 [knex는 함수가 아닙니다] 던졌다.

나는 knex 모듈이 부적절하게로드되고있는 것이 문제라고 생각했지만, 그런 경우인지 확인하는 방법을 모르겠습니다. 잠시 동안, 나는 다소 혼란 스럽다.

위의 내용이 불분명 한 경우 죄송합니다. 저는 여전히 노드 및 자바 스크립트 개발에 익숙하지 않으며이 문제를 해결하는 데 도움이되는 기타 정보를 제공해 드리고자합니다.

감사합니다!

편집 :

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

당신이 pls는 knexfile 추가 할 수 있습니다 : 그래서 그것은 또한 더 나은 knex에서 그것을 설정 될 수있다이 방법은 같은 문자열을 연결하는 대신 디버그 모드를 강제

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

bookshelf.js을 변경? – paqash

+0

예! 원래 게시물에 추가됨 – abhuptani

답변

0

이 사람은 교묘했다. 이 문제는 .debug(true) knex 호출로 인해 발생했으며 이 아니며 knex 인스턴스를 반환했습니다.

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