gpt4 book ai didi

javascript - 导出在 JavaScript 中如何工作。哈希未定义 bcryptjs

转载 作者:行者123 更新时间:2023-12-03 01:58:07 24 4
gpt4 key购买 nike

假设我们有两个文件,user.js 和 user.js 中的 users.js。为什么我们可以做 module.exports.. 我们可以在其中使用 diff .js 文件? “@returns Promise Ifcallback has been obliged” 意味着它来自 bcrypt.genSalt 函数是什么?我还有一个github repo,所以如果你有时间的话请看一下。克隆后

卡在终端

    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.
});
});

为 mongo 数据库添加图片 enter image description here

最佳答案

我认为问题出在这一行:

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

这意味着 User.hashPassword(result.value.password) 应该返回一个 Promise(但它返回对错误 Promise 的引用)。

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

也许修改上面的内容以返回 promise 可能会有所帮助..就像这样:

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

回答有关@returns Promise If回调已被省略的问题:

Bcrypt 方法是异步的。这意味着它们立即返回并在后台处理。当结果可用时,该函数通过回调函数或 promise 将其提供给调用代码。

考虑文档中 genSalt 的以下 API:

genSalt(rounds, minor, cb)

rounds - [OPTIONAL] - the cost of processing the data. (default - 10)

minor - [OPTIONAL] - minor version of bcrypt to use. (default - b)

cb - [OPTIONAL] - a callback to be fired once the salt has been generated. uses eio making it asynchronous. If cb is not specified, a Promise is returned if Promise support is available.

   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);
});

使用 promise 的示例

如果未传递 cb 参数(null 或未定义),则函数将返回 Promise。

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

关于javascript - 导出在 JavaScript 中如何工作。哈希未定义 bcryptjs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50148152/

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