作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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
不再正确)。
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/
在 express +护照+本地策略应用程序中,我使用bcrypt散列密码,这是有效的: var bcrypt = require('bcrypt-nodejs'); familySchema.pre
我正在尝试使用 TypScript 编写 Cucumber 测试,如下所示: import { browser, $$ } from 'protractor'; import { Given, The
我的 friend 们,不幸的是我找不到任何关于如何在 node js express mongoose 应用程序中实现 bluebird promise 库的示例。 我的应用程序设置中 Mongoo
我是一名优秀的程序员,十分优秀!