我正在使用Express和Mongo创建一个简单的Node.js API,我将在未来使用React制作前端,但是现在我只是添加模型而我遇到了问题(与'用户'模型)没有存储密码。
这是我的代码:
const mongoose = require('mongoose');
const crypto = require('crypto');
const UserSchema = new mongoose.Schema({
name: {type: String, required: true},
username: {type: String, required: true},
email: {type: String, required: true, lowercase: true, index: true},
hash: String,
salt: String
});
UserSchema.methods.setPassword = (password) => {
this.salt = crypto.randomBytes(16).toString('hex');
this.hash = crypto.pbkdf2Sync(password, this.salt, 10000, 512, 'sha').toString('hex');
};
UserSchema.methods.validPassword = (password) => {
let hash = crypto.pbkdf2Sync(password, this.salt, 10000, 512, 'sha').toString('hex');
return this.hash === hash;
}
mongoose.model('User', UserSchema);
module.exports = mongoose.model('User');
我在我的架构中定义了两个实例方法,我只能使用该架构的实例访问这些方法,我在这里尝试:
const express = require('express');
const router = express.Router();
const bodyParser = require('body-parser');
const UserSchema = require('./User');
router.use(bodyParser.urlencoded({extended: true}));
router.post('/users', (req, res) => {
let body = req.body;
const User = new UserSchema();
User.name = body.name;
User.username = body.username;
User.email = body.email;
User.setPassword(body.password);
User.save((err, user) => {
if (err) return res.status(500).send('There were problems while creating the user.');
res.status(200).send(user);
})
});
我正在创建一个新的模式实例,并使用该实例访问实例方法,问题是字段'哈希'和' salt '受实例方法的影响,根本没有受到影响。
我在控制台中打印哈希和盐,它们正在生成但未保存,事实上,当我检查Mongo时,所有内容都被存储但哈希和盐却没有。我做错了吗?
答案 0 :(得分:1)
问题是您的setPassword
和validPassword
方法是箭头功能。
箭头函数将this
绑定到周围范围的上下文。在你的情况下,它将是全球范围。
将您的方法更改为常规功能,它将起作用:
UserSchema.methods.setPassword = function(password) {
this.salt = crypto.randomBytes(16).toString('hex');
this.hash = crypto.pbkdf2Sync(password, this.salt, 10000, 512, 'sha').toString('hex');
};
UserSchema.methods.validPassword = (password) {
let hash = crypto.pbkdf2Sync(password, this.salt, 10000, 512, 'sha').toString('hex');
return this.hash === hash;
}