Проблемы с книжной полкой / книжной полкой-моделью: добавление функций и доступ к базе в расширении
Я пытаюсь выучить 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
решил проблему.