FeathersJS:如何通过后续钩子的错误取消认证钩子?
如何通过后续钩子抛出错误终止Feathers认证流程
在Feathers的钩子执行逻辑里,before钩子是按你配置的顺序挨个执行的——只要其中某个钩子抛出错误,整个钩子链会立刻停下来,后续步骤都不会执行,而且这个错误会直接返回给客户端,这样自然就取消了认证的后续流程(不会生成认证令牌)。
针对你的场景,你已经先执行了authentication.hooks.authenticate(config.strategies)来验证用户凭证,接下来在自定义的异步钩子里,只要在检查用户状态时抛出合适的错误,就能直接终止认证。
给你调整后的代码示例,你可以参考:
const { authenticate } = require('@feathersjs/authentication'); const { BadRequest, Forbidden } = require('@feathersjs/errors'); // 导入Feathers内置错误类型 app.service('authentication').hooks({ before: { create: [ authenticate(config.strategies), async context => { const { app, data } = context; // 按用户名大写查询用户 const userQueryResult = await app.service('users').find({ query: { usernameUpperCase: data.username.toUpperCase(), $limit: 1 } }); const targetUser = userQueryResult.data[0]; // 如果没找到用户,抛出错误终止认证 if (!targetUser) { throw new BadRequest('该用户不存在'); } // 举个例子:如果用户被禁用,也终止认证 if (targetUser.isDisabled) { throw new Forbidden('用户已被禁用,无法登录'); } // 没问题的话,返回context让后续流程继续(如果有的话) return context; } ] } });
当你在这个自定义钩子中抛出错误时,Feathers会立刻中断整个认证流程,不会完成authentication服务的create操作(也就是不会生成JWT或其他认证凭证),客户端调用app.authenticate时会收到对应的错误提示,认证请求就被取消了。
这里有几个小细节要注意:
- 尽量用Feathers内置的错误类型(比如
BadRequest对应400,Forbidden对应403),这些错误会自动被处理成标准的HTTP响应状态码,客户端更容易处理。 users.find返回的是分页对象,用户数据在data数组里,所以要取data[0]来获取单个用户。- 钩子函数要么返回
context,要么抛出错误——如果不返回context,后续钩子(如果有的话)会拿到无效的上下文,但在你需要终止流程的场景下,抛出错误就够了。
内容的提问来源于stack exchange,提问作者Meteor_UN666
相关产品推荐
相关产品推荐

