FeathersJS:如何使用挂钩后的错误取消身份验证挂钩
FeathersJS: How to cancel the authentication hook using an error from a hook after it
我在客户端使用了app.authenticate
。
它在服务器上创建挂钩之前调用了身份验证挂钩。
我从 'feathers-authentication-manage.hook' 导入为 verifyHooks
.
创建挂钩之前:
app.service('authentication').hooks({
before: {
create: [
authentication.hooks.authenticate(config.strategies),
async context => {
const { app, data } = context;
await app.service('users').find({
query: {
usernameUpperCase: data.username.toUpperCase(),
$limit: 1
}
})
.then(async (user) => {
await user.data.map(async data => {
if(!data.isVerified) {
await console.log('HELLO FROM ABOVE.');
//await v.validationError('Verify Email. A token link has been sent to your email.');
}
});
})
.catch(err => v.validationError(err));
},
verifyHooks.isVerified()
],
3 个挂钩的顺序是:
1. 认证
2.我的钩子
3. isVerified()
来自 feathers-authentication management 的 email verify hook
在客户端,当 isVerified()
挂钩激活时,即使在身份验证挂钩之后,身份验证承诺也会被拒绝。
如果我删除了 isVerified()
钩子,认证承诺就会解决。
我如何使我的钩子(第二个钩子)表现得像 isVerified()
以便拒绝客户端上的身份验证承诺?
首先,您使用 async/await
并非本意,这让您的生活变得更加艰难。这个想法是不必编写所有那些 .then
和 .catch
处理程序。
.catch
处理程序也可能是实际问题所在。如果 .catch
(在你的例子中是 v.validationError(err)
)没有拒绝或抛出错误,承诺将成功解决。使用 async/await
正确的方式和 Promise.all
等待异步验证步骤然后重新抛出验证错误应该这样做:
app.service('authentication').hooks({
before: {
create: [
authentication.hooks.authenticate(config.strategies),
async context => {
const { app, data } = context;
const user = await app.service('users').find({
query: {
usernameUpperCase: data.username.toUpperCase(),
$limit: 1
}
});
try {
await Promise.all(user.data.map(async data => {
if(!data.isVerified) {
await console.log('HELLO FROM ABOVE.');
//await v.validationError('Verify Email. A token link has been sent to your email.');
}
});
} catch(err) {
throw v.validationError(err);
}
},
我在客户端使用了app.authenticate
。
它在服务器上创建挂钩之前调用了身份验证挂钩。
我从 'feathers-authentication-manage.hook' 导入为 verifyHooks
.
创建挂钩之前:
app.service('authentication').hooks({
before: {
create: [
authentication.hooks.authenticate(config.strategies),
async context => {
const { app, data } = context;
await app.service('users').find({
query: {
usernameUpperCase: data.username.toUpperCase(),
$limit: 1
}
})
.then(async (user) => {
await user.data.map(async data => {
if(!data.isVerified) {
await console.log('HELLO FROM ABOVE.');
//await v.validationError('Verify Email. A token link has been sent to your email.');
}
});
})
.catch(err => v.validationError(err));
},
verifyHooks.isVerified()
],
3 个挂钩的顺序是:
1. 认证
2.我的钩子
3. isVerified()
来自 feathers-authentication management 的 email verify hook
在客户端,当 isVerified()
挂钩激活时,即使在身份验证挂钩之后,身份验证承诺也会被拒绝。
如果我删除了 isVerified()
钩子,认证承诺就会解决。
我如何使我的钩子(第二个钩子)表现得像 isVerified()
以便拒绝客户端上的身份验证承诺?
首先,您使用 async/await
并非本意,这让您的生活变得更加艰难。这个想法是不必编写所有那些 .then
和 .catch
处理程序。
.catch
处理程序也可能是实际问题所在。如果 .catch
(在你的例子中是 v.validationError(err)
)没有拒绝或抛出错误,承诺将成功解决。使用 async/await
正确的方式和 Promise.all
等待异步验证步骤然后重新抛出验证错误应该这样做:
app.service('authentication').hooks({
before: {
create: [
authentication.hooks.authenticate(config.strategies),
async context => {
const { app, data } = context;
const user = await app.service('users').find({
query: {
usernameUpperCase: data.username.toUpperCase(),
$limit: 1
}
});
try {
await Promise.all(user.data.map(async data => {
if(!data.isVerified) {
await console.log('HELLO FROM ABOVE.');
//await v.validationError('Verify Email. A token link has been sent to your email.');
}
});
} catch(err) {
throw v.validationError(err);
}
},