gpt4 book ai didi

express - 使用 Promisy 重构护照本地策略。 .catch() 的问题

转载 作者:行者123 更新时间:2023-12-03 08:10:28 26 4
gpt4 key购买 nike

在 express +护照+本地策略应用程序中,我使用bcrypt散列密码,这是有效的:

var bcrypt = require('bcrypt-nodejs');

familySchema.pre('save', function(next) {
var family = this;
var SALT_FACTOR = 14;

if (!family.isModified('password')) return next();

bcrypt.genSalt(SALT_FACTOR, function(err, salt) {
if (err) return next(err);

bcrypt.hash(family.password, salt, null, function(err, hash) {
if (err) return next(err);
family.password = hash;
next();
});
});
});

然后我使用 promisify 进行了重构和 async/await :
const bcrypt = require('bcrypt-nodejs');
const util = require('util');
const bcryptGenSalt = util.promisify(bcrypt.genSalt);
const bcryptHash = util.promisify(bcrypt.hash);

familySchema.pre('save', async function(next) {
var family = this;
const SALT_FACTOR = 14;
if (!family.isModified('password')) return next();
const salt = await bcryptGenSalt(SALT_FACTOR).catch(next);
const hash = await bcryptHash(family.password, salt, null).catch(next);
family.password = hash;
next();
});
  • 这种重构真的正确吗?
  • 如何仔细检查 bcryptGenSalt 中的错误或 bcryptHash被正确捕获了吗?有没有办法以某种方式“强制”bcryptGenSalt抛出错误,进行测试?
  • 下一步,如何删除这两个 .catch(next) , 使用 wrapAsync实用功能:
  • wrapAsync.js :
    module.exports = fn => (req, res, next) => fn(req, res, next).catch(next);

    以下尝试无效,错误: family.isModified()不是函数,(可能是因为 this 不再正确)。
    以及如何处理 wrapAsync 的参数,如 next应该是第三个论点?
    familySchema.pre(
    'save',
    wrapAsync(async function(req, res, next) {
    var family = this;
    const SALT_FACTOR = 14;
    debugger;
    if (!family.isModified('password')) return next();
    const salt = await bcryptGenSalt(SALT_FACTOR);
    const hash = await bcryptHash(family.password, salt, null);
    family.password = hash;
    next();
    })
    );

    最佳答案

    重构不正确,因为在 .catch 之后语句,函数的其余部分将继续运行。因此,例如 bcryptGenSalt引发错误,next被调用(因为 .catch(next) ),但它也会继续下一行代码,直到函数结束(再次调用 next)。

    通常,在 async函数,你使用 try/catch围绕可能引发错误的语句:

    familySchema.pre('save', async function(next) {
    const SALT_FACTOR = 14;
    if (!this.isModified('password')) return next();
    try {
    const salt = await bcryptGenSalt(SALT_FACTOR);
    const hash = await bcryptHash(this.password, salt, null);
    this.password = hash;
    return next();
    } catch(err) {
    return next(err);
    }
    });

    Is there a way to somehow "force" bcryptGenSalt into throwing an error, for testing?



    这取决于您用于测试的工具,但有像 sinon 这样的包它可以 stub 现有函数,因此您可以可控地生成然后抛出错误,然后您可以对其进行测试。

    关于express - 使用 Promisy 重构护照本地策略。 .catch() 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53209106/

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