Bookshelf/Bookshelf-modelbase 在扩展中添加函数和访问基础时遇到问题
Bookshelf/Bookshelf-modelbase problems adding functions and accessing base in extend
我正在努力学习 Bookshelf.js。我正在使用 bookshelf-modelbase to help with models, and I'm using 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()
但我发现 this
在 password(pw).hash
的回调中有所不同,这就是为什么我首先使用 var user = this
。
当我在该回调中将 user
登录到控制台时("debugging" 注释所在的位置),我确实看到了一个用户模型错误,如错误消息所述,没有 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,虽然标题很有前途,但 似乎 不适用。
我想通了,这实际上是一个非常简单的错误。
查看 code for bookshelf-modelbase,update
是一个 class 方法,而不是实例方法(它作为第二个参数传递给 Bookshelf 的 extend
)(另外,回想起来阅读模型库文档是显而易见的。
所以它不能在那种情况下使用。最直接的方法就是使用实例方法 save
代替。
因此,将 user.update
切换为 user.save
解决了问题。
我正在努力学习 Bookshelf.js。我正在使用 bookshelf-modelbase to help with models, and I'm using 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()
但我发现 this
在 password(pw).hash
的回调中有所不同,这就是为什么我首先使用 var user = this
。
当我在该回调中将 user
登录到控制台时("debugging" 注释所在的位置),我确实看到了一个用户模型错误,如错误消息所述,没有 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,虽然标题很有前途,但 似乎 不适用。
我想通了,这实际上是一个非常简单的错误。
查看 code for bookshelf-modelbase,update
是一个 class 方法,而不是实例方法(它作为第二个参数传递给 Bookshelf 的 extend
)(另外,回想起来阅读模型库文档是显而易见的。
所以它不能在那种情况下使用。最直接的方法就是使用实例方法 save
代替。
因此,将 user.update
切换为 user.save
解决了问题。