Как работает экспорт в Java JavaScript? хеш не определен bcryptjs - PullRequest
0 голосов
/ 03 мая 2018

Допустим, у нас есть два файла user.js users.js в user.js. Почему мы можем сделать module.exports .. мы можем использовать в нем файл diff .js? что означает "@returns Promise If callback has been omitted" из функции bcrypt.genSalt? У меня также есть репозиторий github , поэтому, пожалуйста, посмотрите, если у вас есть немного времени. после клонирования

застрял в терминале

    result { error: null,
  value:
   { email: 'max@mail.com',
     username: 'max',
     password: '1234',
     confirmationPassword: '1234' },
  then: [Function: then],
  catch: [Function: catch] }
hash undefined


const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const bcrypt = require('bcryptjs');


const userSchema = new Schema({
  email: String,
  username: String,
  password: String
});


const User = mongoose.model('user', userSchema);
module.exports = User;
module.exports.hashPassword = (password) => {
 return hash = bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash(password, salt, function(err, hash) {
    });
});
}; 

в users.js у нас есть

const express = require('express');
const router = express.Router();
const Joi = require('joi');
const User = require('../models/user');   



const userSchema = Joi.object().keys({
  email:Joi.string().email().required(),
  username:Joi.string().required(),
  password:Joi.string().regex(/^[a-zA-Z0-9]{3,15}$/).required(),
  confirmationPassword:Joi.any().valid(Joi.ref('password')).required()
});



router.route('/register')
  .get((req, res) => {
    res.render('register');
  })
  .post(async (req, res, next) => {
    try{
        const result =  Joi.validate(req.body,userSchema);
        console.log('result',result);

        if(result.error) {
          req.flash('error', 'Data is not valid, please try again');
          res.redirect('/users/register');
          return;
        //console.log('result',result);
      }
      //  checking if email is already taken
      const user =  await User.findOne({'email':result.value.email });
        if (user){
          req.flash('error','Email is already in use');
          res.redirect('/users/register');
          return;
        }


     // console.log('hash',hash);

      // Hash the password
      const hash = await User.hashPassword(result.value.password); 
      console.log('hash',hash);

  } catch(error) {
    next(error);
    }
  });
module.exports = router;

на основе примера, данного bcrypt

var bcrypt = require('bcryptjs');
bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash("B4c0/\/", salt, function(err, hash) {
        // Store hash in your password DB.
    });
});

добавление картинки для dong монго enter image description here

1 Ответ

0 голосов
/ 03 мая 2018

Я думаю, что проблема заключается в этой строке:

const hash = await User.hashPassword(result.value.password);

Это означает, что User.hashPassword(result.value.password) должно возвращать обещание (но оно возвращает ссылку на неправильное обещание).

module.exports.hashPassword = (password) => {
    return hash = bcrypt.genSalt(10, function (err, salt) {
        bcrypt.hash(password, salt, function (err, hash) {});
    });
};

Возможно, поможет модификация вышеприведенного, чтобы вернуть обещание .. Вот так:

module.exports.hashPassword = (password) => {
    var salt = await bcrypt.genSalt(10);
    return bcrypt.hash(password, salt);
};

Чтобы ответить на ваш вопрос о @returns Promise If callback has been omitted:

Методы Bcrypt являются асинхронными. Это означает, что они немедленно возвращаются и обрабатывают в фоновом режиме. Когда результат доступен, функция делает его доступным для вызывающего кода либо через функцию обратного вызова, либо через обещание.

Рассмотрим следующий API для genSalt из документов:

genSalt (раунды, минор, кб)

раундов - [ДОПОЛНИТЕЛЬНО] - стоимость обработки данных. (по умолчанию - 10)

minor - [ДОПОЛНИТЕЛЬНО] - дополнительная версия bcrypt для использования. (по умолчанию - b)

cb - [ДОПОЛНИТЕЛЬНО] - обратный вызов, который должен быть запущен после генерации соли. использует eio, делая его асинхронным. Если cb не указан, Promise возвращается, если доступна поддержка Promise.

   err - First parameter to the callback detailing any errors.

   salt - Second parameter to the callback providing the generated salt.

То, что говорит genSalt, может принимать три аргумента: genSalt(rounds, minor, cb)

Пример использования обратных вызовов

Если вызывающий код хочет получить результат через обратный вызов, он может передать функцию, которая выглядит как function(err, salt){}, в качестве параметра cb.

 bcrypt.genSalt(rounds, minor, function(err, salt){
     if(err){
         //Handle error
         return;
     }
     // Salt is available here
     console.log(salt);
 });

Образец с обещаниями

Если параметр cb не передан (нулевой или неопределенный), функция возвращает вместо этого Promise.

 var promise = bcrypt.genSalt(rounds, minor);
 promise
     .then(function(salt){
         // Salt is available here
         console.log(salt);
     })
     .catch(function(err){
         // Handle error
     });
...