Проблемы с книжной полкой / книжной полкой-моделью: добавление функций и доступ к базе в расширении

Я пытаюсь выучить Bookshelf.js. Я использую bookshelf-modelbase, чтобы помочь с моделями, и использую пароль-хэш-соль для хранения паролей в базе данных.

В данный момент я пытаюсь добавить функцию для установки пароля пользователя, используя пароль-хэш-соль для генерации строки, которая хранится в 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

Теперь, книжная полка-модель добавляет 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 модель, позвоните, и сделать обновление изнутри? Все, что я действительно нашел, было этим сообщением, и, хотя название многообещающее, это, кажется, не применяется.

1 ответ

Решение

Я понял это, на самом деле это довольно простая ошибка.

Глядя на код для книжной полки-базы моделей, update является методом класса, а не методом экземпляра (он передается как 2-й параметр в Книжную полку extend) (также, очевидное чтение документов базы моделей в ретроспективе).

Так что это не может быть использовано в этом контексте. Самое простое - просто использовать метод экземпляра. save вместо.

Итак, переключение user.update в user.save решил проблему.

Другие вопросы по тегам