2016-08-20 2 views
1

Я новичок в mongoose и node.js. Я стараюсь следовать этому руководству: https://scotch.io/tutorials/using-mongoosejs-in-node-js-and-mongodb-applications#sample-model-for-usersMongoose «метод схемы» обратный вызов не работает

В моей точке входа index.js я попытался вызвать «chenya.saltHashPassword (function (err, passwordHash)». Он фактически вызывается в user.js, потому что user.js может распечатать три сообщения журнала, однако, нет никаких сообщений журнала для этого вызова метода вообще в index.js в противоположность этому, способ сохранения можно распечатать сообщение журнала об успешной экономии .:

//Lets load the mongoose module in our program 
var mongoose = require('mongoose'); 

//Lets connect to our database using the DB server URL. 
mongoose.connect('mongodb://localhost:27017/server_naturis'); 

// if our user.js file is at app/models/user.js 
var User = require('./user'); 

// create a new user called Chenya 
var chenya = new User({ 
    userName: 'Chenya', 
    email: '[email protected]', 
    password: 'Chenya' 
}); 

// call the custom method. hash the password 
chenya.saltHashPassword(function(err, passwordHash) { // NOT CALLED! 
    if (err) { 
    console.log('chenya.saltHashPassword: ' + err); 
    } else { 
    this.password = passwordHash; 
    console.log('Your hashed password is ' + passwordHash); 
    } 
}); 

// call the built-in save method to save to the database 
chenya.save(function(err) { // CALLED! 
    if (err) { 
    console.log('chenya.save: ' + err); 
    } else { 
    console.log('User saved successfully!'); 
    } 
}); 

в моем пользователь. .js, у меня есть функция схемы «userSchema.methods.saltHashPassword»:

// grab the things we need 
var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

// Require the crypto module for password hash 
'use strict'; 
var crypto = require('crypto'); 

// create a schema 
var userSchema = new Schema({ 
    userName: { type: String, required: true, unique: true }, 
    email: { type: String, required: true, unique: true }, 
    password: { type: String, required: true }, 
}); 

// add a schema method 
/** 
* generates random string of characters i.e salt 
* @function 
* @param {number} length - Length of the random string. 
*/ 
var genRandomString = function(length){ 
    return crypto.randomBytes(Math.ceil(length/2)) 
      .toString('hex') /** convert to hexadecimal format */ 
      .slice(0,length); /** return required number of characters */ 
}; 
/** 
* hash password with sha512. 
* @function 
* @param {string} password - List of required fields. 
* @param {string} salt - Data to be validated. 
*/ 
var sha512 = function(password, salt){ 
    var hash = crypto.createHmac('sha512', salt); /** Hashing algorithm sha512 */ 
    hash.update(password); 
    var value = hash.digest('hex'); 
    return { 
     salt:salt, 
     passwordHash:value 
    }; 
}; 
/** 
* a function that will use the above function 
* to generate the hash that should be stored 
* in the database as user’s password. 
*/ 
userSchema.methods.saltHashPassword = function() { 
    var salt = genRandomString(16); /** Gives us salt of length 16 */ 
    var passwordData = sha512(this.password, salt); 
    console.log('UserPassword = '+ this.password); 
    console.log('Passwordhash = '+ passwordData.passwordHash); 
    console.log('\nSalt = '+ passwordData.salt); 
    return passwordData.passwordHash; 
} 

// the schema is useless so far 
// we need to create a model using it 
var User = mongoose.model('User', userSchema); 

// make this available to our users in our Node applications 
module.exports = User; 

Terminal:

UserPassword = Chenya 
Passwordhash = 5bb5bf2181e2c713bae1eb49d1f3646b23db839368d38c33951774c92cec39a3c4b855aea30875e72cce6f271bdbdb27de8976c9316df09d086435b6c5629548 

Salt = a88384d072b720de 
(node:11717) DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html 
User saved successfully! 

ответ

2

Вы не переходящая в качестве параметра обратного вызова в userSchema.methods.saltHashPassword но обработку функции, как если бы вы сделали.

Изменить userSchema.methods.saltHashPassword на:

userSchema.methods.saltHashPassword = function(callback) { // <-- Add callback param 
    var salt = genRandomString(16); /** Gives us salt of length 16 */ 
    var passwordData = sha512(this.password, salt); 
    console.log('UserPassword = '+ this.password); 
    console.log('Passwordhash = '+ passwordData.passwordHash); 
    console.log('\nSalt = '+ passwordData.salt); 

    // Your function that you passed in is called here 
    callback(null, passwordData.passwordHash); 
} 

Причина, по которой вы обратный вызов был не вызывается в saltHashPassword, но был призван в save потому, что Mongoose определяет, что метод требует функцию обратного вызова, которая принимает в качестве параметра для ошибки и фактического возвращаемого значения.

При возникновении ошибки ожидается, что обратный вызов будет иметь обработку ошибок, что является хорошей практикой и почему вы видите учебники, предлагающие вам сделать то же самое. Когда вы определяете свой собственный метод для Schema, у вас больше нет этого и вы должны настроить его самостоятельно.

Как вы можете видеть в функции выше, вот что произошло. Теперь вы обратный вызов передается в качестве параметра, вызывающего его с callback(null, passwordData.passwordHash), запустит его. Если у вас возникла ошибка, вы можете сохранить ее как переменную, например. err и передать это в вашу функцию callback(err, null)

Возвращение к солям. Я не читал ваш учебник, но очень важно, чтобы вы сохранить их в базе данных вместе с пользовательскими данными, так что пароли могут быть проверены при входе пользователя в

Хорошего ресурса здесь:.

Password Hashing add salt + pepper or is salt enough?

Вам нужна соль, чтобы создать тот же хешированный пароль, который вы храните в базе данных. Если у вас нет доступа к этой соли, вы не можете знать, будет ли пароль, предоставленный вам, генерировать один и тот же хеш.

 Смежные вопросы

  • Нет связанных вопросов^_^