2017-05-17 12 views
0

我是新的node.js和ORM的,我使用書架的數據庫查詢。 所以,我檢查了書架的文件,當我試圖建立一個查詢,以我現有的架構在MySQL它引發以下錯誤:builder = 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

我已經添加了用戶和數據庫。 –

回答

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的數據庫(如Bookshelf),更好的方法應該是使用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代碼存在一個問題,那就是您正在用undefined knex初始化書架。

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

沒有引發錯誤,在那裏,因爲JavaScript var變量提升到從即使他們未初始化函數的開始總是存在的。

如果您使用let來聲明變量,當您嘗試初始化書架時,節點會拋出一些未知的變量錯誤。