gpt4 book ai didi

javascript - "this"sequelize中的关键字不引用当前实例

转载 作者:行者123 更新时间:2023-12-03 22:43:17 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Javascript "this" scope

(3 个回答)


4年前关闭。




我创建了一个这样的用户模型,我想编写一个函数来更新用户的密码 updatePassword():

"use strict";
var bcrypt = require('bcryptjs');

module.exports = function(sequelize, DataTypes) {
var User = sequelize.define('User', {
name: {
type: DataTypes.STRING,
allowNull: false
},
password: {
type: DataTypes.STRING,
allowNull: false
},
email: {
type: DataTypes.STRING,
primaryKey: true
},
phone: {
type: DataTypes.STRING,
allowNull: true
}
}, {
instanceMethods:{
updatePassword: function(newPass, callback){
console.log("current pass in update: " + this.password);
bcrypt.genSalt(10, function(err,salt){
bcrypt.hash(newPass, salt, function(err, hashed){
console.log("current pass: " + this.password);
this.password = hashed;
return callback();
});
});
},
comparePassword: function(password, callback){
bcrypt.compare(password, this.password, function(err, isMatch){
if(err) {
throw err;
}
callback(isMatch);
});
}
}

第一个日志 console.log("current pass in update: " + this.password);打印当前对象的密码,但第二个 console.log("current pass: " + this.password);不起作用并打印错误: TypeError: Cannot read property 'password' of undefined .为什么会发生以及如何解决?

最佳答案

这是因为您使用的是 functionbycrypt 定义回调

解决方案 1(普通 ES5)是定义一个 self 来引用(想要的)this在注册调用之前:

...
console.log("current pass in update: " + this.password);
var self = this;
bcrypt.genSalt(10, function(err,salt){
bcrypt.hash(newPass, salt, function(err, hashed){
console.log("current pass: " + self.password);
self.password = hashed;
...

解决方案 2(Node 现在支持相当长一段时间的 ES6)是使用箭头函数,它会自动为您处理这个问题:
...
console.log("current pass in update: " + this.password);
bcrypt.genSalt(10, (err,salt) => {
bcrypt.hash(newPass, salt, (err, hashed) => {
console.log("current pass: " + this.password);
this.password = hashed; // note this in an arrow function refers to the 'uppper' this
...

关于javascript - "this"sequelize中的关键字不引用当前实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43995215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com