我做了这样的功能,应该检查当前用户是否禁止使用该模块。如果是-返回错误,否则返回-然后让他做其他的钩子/处理到api路由。在服务挂钩中调用此方法。
function isAppForbidden(hook) {
return new Promise((resolve, reject) => {
hook.app.services.settings.find({
query: {
$limit: 1,
$sort: {
createdAt: -1
}
},
user: {
roleId: hook.params.user.roleId
}
}).then(res => {
if(res.data.length > 0) {
let userHiddenApps = hook.params.user.hiddenApps || [];
let globalHiddenApps = res.data[0].forbiddenApps || [];
if (userHiddenApps.indexOf('qualitydocs') >= 0 || globalHiddenApps.indexOf('qualitydocs') >= 0) {
reject(new errors.Forbidden()); //throws error for forbidden moduels
}
resolve();
}
})
})
}
before: {
all: [
authenticate('jwt'),
hook => includeBefore(hook),
hook => isAppForbidden(hook)
],
find: [],
get: [],
create: [(hook) => {
hook.data.authorId = hook.params.user.id;
}],
update: [],
patch: [],
remove: []
},
在我的本地计算机上,一切正常。如果模块被禁止,我得到禁止错误,如果不是,那么我从路由中获取数据。但是在我的生产机器上,它不是那样工作的,如果不禁止模块(无错误),我将无法收到任何响应,好像它以某种形式在“ resolve()”部分循环了一样?可能吗?这样的承诺对您来说还不错吗?
我知道它很奇怪的问题,但是我不知道从哪里开始,因为它在本地运行得很好,并且在生产中没有错误(除非它破坏了整个应用程序,不再有响应,直到您重新加载页面为止)。
答案 0 :(得分:1)
问题在于,如果res.data.length <= 0
,您的承诺将永远无法实现。通常,使用Feathers功能时,您不必自己调用new Promise
,因为一切都已经返回了promises。您可以使用async/await使您的生活更加轻松,这将使代码更易于遵循,并且完全避免了您的问题:
async function isAppForbidden(hook) {
const res = await hook.app.service('settings').find({
query: {
$limit: 1,
$sort: {
createdAt: -1
}
},
user: {
roleId: hook.params.user.roleId
}
});
if(res.data.length > 0) {
let userHiddenApps = hook.params.user.hiddenApps || [];
let globalHiddenApps = res.data[0].forbiddenApps || [];
if (userHiddenApps.indexOf('qualitydocs') >= 0 || globalHiddenApps.indexOf('qualitydocs') >= 0) {
throw new errors.Forbidden(); //throws error for forbidden moduels
}
}
return hook;
}
before: {
all: [
authenticate('jwt'),
includeBefore,
isAppForbidden
],
find: [],
get: [],
create: [(hook) => {
hook.data.authorId = hook.params.user.id;
}],
update: [],
patch: [],
remove: []
},