2017-05-17 4 views
0

私はnode.jsとORMで新しく、db querysにはbookshelfを使用しています。 だから、私は本棚のドキュメントをチェックし、私はMySQLでの私の既存のスキーマへのクエリを構築しようとしているときには、次のエラーがスローされます。ここビルダー= bookshelf.knex(tableNameOrBuilder);

TypeError: bookshelf.knex is not a function 
     at Child.builderFn [as _builder] (/home/mauricio/techday/techday-   node/node_modules/bookshelf/lib/bookshelf.js:314:27) 
at Object.query (/home/mauricio/techday/techday-node/node_modules/bookshelf/lib/helpers.js:44:23) 
at Child.query (/home/mauricio/techday/techday-node/node_modules/bookshelf/lib/model.js:1243:30) 
at Function.Model.(anonymous function).Collection.(anonymous function) [as query] (/home/mauricio/techday/techday-node/node_modules/bookshelf/lib/bookshelf.js:333:28) 
at Object.<anonymous> (/home/mauricio/techday/techday-node/app.js:20:2) 
at Module._compile (module.js:571:32) 
at Object.Module._extensions..js (module.js:580:10) 
at Module.load (module.js:488:32) 
at tryModuleLoad (module.js:447:12) 
at Function.Module._load (module.js:439:3) 
at Module.runMain (module.js:605:10) 
at run (bootstrap_node.js:427:7) 
at startup (bootstrap_node.js:151:9) 
at bootstrap_node.js:542:3 

は私のクエリです:

user 
     .query('where', 'usuario', '=', 'admin') 
     .fetch() 
     .then(function(user) { 
     console.log(user) 
    }); 

ここに私のdb.jsです:

'use strict' 
     var db = require('bookshelf')(knex); 
     var securePassword = require ('bookshelf-secure-password'); 
     db.plugin(securePassword); 
     db.plugin('registry'); 


     var knex = require('knex')({ 
     client: 'mysql', 
     connection: { 
     host: 'localhost', 
     user: 'root', 
     password: 'password', 
     database: 'test', 
     charset: 'utf8' 
     } 
    }); 




     module.exports = db; 

そして今、私のuser.jsの

var db = require('../Commons/db.js'); 
var bcrypt = require('bcrypt-nodejs'); 

var user = db.Model.extend({ 
    tableName: 'usuario', 
    hasSecurePassword: 'contraseña' 
}); 



module.exports = db.model('user',user); 
+0

どのように 'db'と' user'定義されていますか?両方を定義するコードを追加してください。 – flaviodesousa

+0

私は既にuserとdbの両方を追加しました。 –

答えて

0

の接続の定義は、本棚のインスタンスを作成する前に来るので、あなたにdb.jsを変更する必要があります。とにかく、明示的にコードの上に置かれたデータベース接続を有する

'use strict'; 
var knex = require('knex')({ 
    client: 'mysql', 
    connection: { 
    host: 'localhost', 
    user: 'root', 
    password: 'password', 
    database: 'test', 
    charset: 'utf8' 
    } 
}); 
var db = require('bookshelf')(knex); // now bookshelf knows how to connect 
var securePassword = require('bookshelf-secure-password'); 
db.plugin(securePassword); 
db.plugin('registry'); 

module.exports = db; 

はお勧めしません。ブックシェルフのようなKnexベースのデータベースでは、knexfileを使用する方が良いので、knex CLI(移行、シード)を使いやすくする必要があります。

この場合、あなたのコードは次のようになります。

'use strict'; 
var knex = require('knex')(
    require('./knexfile')[process.env.NODE_ENV||'development']); 
var db = require('bookshelf')(knex); 
var securePassword = require('bookshelf-secure-password'); 
db.plugin(securePassword); 
db.plugin('registry'); 

module.exports = db; 
0

ブックシェルフについてよくわかりませんが、db.jsコードに少なくとも1つの問題がある場合は、ブックシェルフをundefined knexで初期化することです。 JavaScriptのvar変数は、それらが初期化されていない場合でも、関数の開始から常に存在する掲揚されているので、

var db = require('bookshelf')(knex); 
// knex is still undefined and will be initialized later on 
// when you do var knex = require('knex')({...}) 

エラーは、そこにスローされません。

letを使用して変数を宣言すると、ノードはブックシェルフを初期化しようとすると、不明な変数エラーがスローされます。