【问题标题】:Bookshelf/Bookshelf-modelbase problems adding functions and accessing base in extendBookshelf/Bookshelf-modelbase 问题在extend中添加函数和访问base
【发布时间】:2016-12-10 00:54:06
【问题描述】:

我正在尝试学习 Bookshelf.js。我使用bookshelf-modelbase 来帮助模型,我使用password-hash-and-salt 来帮助在数据库中存储密码。

目前我正在尝试添加一个函数来设置用户的密码,使用 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);
                });
            }
        });
    }
});

我正在尝试这样使用它:

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"));
    });
});

我在user.update(...) 行遇到问题:

TypeError: user.update is not a function

现在,bookshelf-modelbase 为模型添加了一个update() 函数,但我想我只是不确定如何使用它。

我最初的尝试使用this.update(),但我发现thispassword(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,虽然标题很有希望,但它似乎不适用。

【问题讨论】:

    标签: javascript node.js bookshelf.js


    【解决方案1】:

    我想通了,这实际上是一个非常简单的错误。

    看看code for bookshelf-modelbaseupdate 是一个类方法,而不是一个实例方法(它作为第二个参数传递给 Bookshelf 的extend)(同样,回想起来阅读模型库文档很明显)。

    所以它不能在那种情况下使用。最直接的方法是只使用实例方法save

    所以,将user.update 切换为user.save 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多