2016-12-09 8 views
0

Bookshelf.jsを習得しようとしています。私はbookshelf-modelbaseを使ってモデルを助けています。私はpassword-hash-and-saltを使ってパスワードをデータベースに保存しています。私はデータベースのpassword列に格納された文字列を生成するパスワードハッシュと塩を使用して、ユーザーのパスワードを設定する機能を追加しようとしている瞬間にBookshelf/Bookshelfモデルベースの問題機能の追加と拡張ベースのアクセス

私は私のモデルは次のように宣言したんだ(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は私が最初にvar user = thisをした理由ですpassword(pw).hashのコールバック内の別の何かが、あることを発見しました。

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 } 

I:私は(「デバッグ」のコメントがある)というコールバック私が説明したエラーメッセージとしてユーザモデルのバグを参照してください行うには、コンソールにuserをログ

は、何update機能がありません私は暗闇の中にいます。

このsetPassword機能をUserモデルに正しく追加して呼び出し、その中からアップデートを行うにはどうすればよいですか?私が実際に見つけたのはthis postでした。タイトルは有望ですが、と思われます。

答えて

0

私はそれを理解しましたが、実際はかなり単純な間違いです。

code for bookshelf-modelbaseを見ると

updateは(振り返ってみるとmodelbaseドキュメントを読んでも、明白な)(それは本棚のextendへの第二のパラメータとして渡された)クラスメソッドではなく、インスタンスメソッドです。

このような状況では使用できません。最も簡単なことは、インスタンスメソッドsaveを代わりに使用することです。

したがって、user.updateからuser.saveに切り替えると問題が解決しました。

関連する問題