【发布时间】:2018-04-24 18:09:45
【问题描述】:
我需要将同事的代码集成到我的网站中。我不知道他为什么决定以类和异步的方式编写数据库,因为我认为没有必要。反正是无害的:
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
class User {
constructor() {
this.user = mongoose.model('user', {
email: String,
password: String,
hash: String,
salt: String,
})
}
checkEmailPassword(email, password) {
return new Promise((resolve, reject) => {
this.user.find({email, password}, {}, (err, users) => {
if(err) throw(err)
if(users.length > 0) resolve(users[0])
else reject('not found')
})
})
}
addAccountWOCheck(userInf, way) {
return new Promise((resolve, reject) => {
var collection = new this.user(userInf)
// collection.setPassword(userInf.password)
collection.save((err, data) => {
if (err) throw (err)
else resolve(data)
})
})
}
}
现在,我想添加一个加密password 的setPassword 函数。我希望该函数由用户实例而不是类调用,例如collection.setPassword(thePassWord) 而不是addAccountWOCheck 中的this.user.setPassword(...),但我不知道如何将此函数插入此类
setPassword = function(email) {
var salt = crypto.randomBytes(16).toString('hex');
var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64, 'SHA1').toString('hex');
}
有人可以帮忙吗?
编辑 1:
我尝试在类内添加:
setPassword(collection) {
collection.hash = "abc";
console.log("setPassword: " + JSON.stringify(collection));
}
并致电addAccountWOCheck:
var collection = new this.user(userInf)
this.setPassword(collection)
collection.save((err, data) => {
if (err) throw (err)
else resolve(data)
})
我可以看到setPassword被调用了,但是collection在数据库中没有被修改。
【问题讨论】:
-
“他”是谁? ;)
-
为什么不直接添加与现有方法
checkEmailPassword和addAccountWOCheck语法完全相同的方法呢?你试过吗?你问过写这门课的同事吗? -
因为每次修改用户之前,都需要先找到用户。但是,我想直接在用户身上工作。
-
@SoftTimur 是的 - 这些其他方法也适用于
Userinstances。它们不是static方法。我不确定您所说的“它需要先找到用户”是什么意思——在实例上调用方法时,您不是已经有用户了吗? -
我希望它可以在编辑 1 中工作。虽然类设计几乎没用。
this状态无关紧要,这些应该是静态方法。此外,save返回一个承诺,不需要被承诺。
标签: javascript express mongoose ecmascript-6 mongoose-schema