2016-12-09 29 views
0

我在學習Bookshelf.js。我使用bookshelf-modelbase來幫助模型,並且我使用password-hash-and-salt來幫助將密碼存儲在數據庫中。書架/書架模型庫問題添加函數和擴展訪問基類

此刻我想添加一個函數來設置用戶密碼,利用密碼哈希和鹽以生成存儲在數據庫中的password列中輸入字符串。

我得聲明如下我的模型(db.js):

var knex = ...; 
var bookshelf = require("bookshelf")(knex); 
var ModelBase = require("bookshelf-modelbase")(bookshelf); 
var Joi = require("joi"); 
var password = require("password-hash-and-salt"); 

module.exports.User = ModelBase.extend({ 
    tableName: "users", 
    hasTimestamps: false, 
    validate: { 
     username: Joi.string().alphanum().min(3).max(64).required(), 
    }, 
    setPassword: function (pw, callback) { 
     var user = this; 
     password(pw).hash(function (err, hash) { 
      if (err) 
       callback(err); 
      else { 
       console.log(user); // debugging 
       user.update({password:hash}).then(function (updated) { 
        return callback(null); 
       }).catch(function (err) { 
        return callback(err); 
       }); 
      } 
     }); 
    } 
}); 

而且我attemptingn使用這樣的:

var db = require("./db.js"); 

db.User.findOne({username:"somebody"}).then(function (user) { 
    user.setPassword("password", function (err) { 
     if (err) 
      console.log(err); 
     else 
      console.log("value set", user.get("password")); 
    }); 
}); 

我在​​行上有問題:

TypeError: user.update is not a function 

現在,bookshelf-modelbase爲模型添加了update()函數,但我想我只是不確定如何使用它。

我原來嘗試使用this.update(),但我發現,this東西password(pw).hash的回調內部的不同,這就是爲什麼我做了var user = this第一。

當我在回調(這裏的「調試」的評論是)我確實看到了用戶模型錯誤的描述的錯誤消息日誌user到控制檯了,有沒有update功能:

constructor { 
    attributes: 
    { username: 'somebody', 
    id: 1, 
    password: '' }, 
    _previousAttributes: 
    { username: 'somebody', 
    id: 1, 
    password: '' }, 
    changed: {}, 
    relations: {}, 
    cid: 'c1', 
    validate: 
    { isJoi: true, 
    _type: 'object', 
    _settings: null, 
    _valids: { _set: [] }, 
    _invalids: { _set: [] }, 
    _tests: [], 
    _refs: [], 
    _flags: {}, 
    _description: null, 
    _unit: null, 
    _notes: [], 
    _tags: [], 
    _examples: [], 
    _meta: [], 
    _inner: 
     { children: [Object], 
     renames: [], 
     dependencies: [], 
     patterns: [] } }, 
    _events: { saving: [Function: validateSave] }, 
    _eventsCount: 1, 
    _knex: null, 
    id: 1 } 

我我不知道該怎麼做,我有點兒黑暗。

如何正確地將此setPassword函數添加到我的User模型中,調用它,並在其中進行更新?我真的找到的是this post,雖然標題很有希望,但並不是似乎適用。

回答

0

我想通了,這實際上是一個非常簡單的錯誤。

望着code for bookshelf-modelbaseupdate是一個類的方法,而不是一個實例方法(它是作爲第二個參數,以書架的extend通過)(也明顯讀取模型庫文檔回想起來)。

所以它不能在這種情況下使用。最簡單的事情就是改用實例方法save

因此,切換user.updateuser.save解決了這個問題。