【发布时间】:2020-07-12 01:19:12
【问题描述】:
我需要帮助来解释一段代码。
我一直在尝试学习如何使用 jwt 对用户进行身份验证并返回令牌和刷新令牌。
这是一次有趣的旅程,我遇到了这个repository,其中用户添加了一个扩展/链功能,据我所知,它结合了多个 graphql 解析器:
// I don't understand this function
const createResolver = (resolver) => {
const baseResolver = resolver;
baseResolver.createResolver = (childResolver) => {
const newResolver = async (parent, args, context, info) => {
await resolver(parent, args, context, info);
return childResolver(parent, args, context, info);
};
return createResolver(newResolver);
};
return baseResolver;
};
export const requiresAuth = createResolver((parent, args, context) => {
if (!context.user || !context.user.id) {
throw new Error('Not authenticated');
}
});
export const requiresAdmin = requiresAuth.createResolver((parent, args, context) => {
if (!context.user.isAdmin) {
throw new Error('Requires admin access');
}
});
它是这样使用的:
Query: {
getBook: requiresAuth.createResolver((parent, args, { models }, info) =>
// do something fun
),
}
我不理解 createResolver 函数,我想问这是否是某种类型的编程范式,其中有一些文章可以让我更好地阅读和理解它。
谷歌搜索我确实找到了graphql-resolvers,据我所知,它做同样的事情,但在这种情况下,我需要安装另一个我想避免但同时我不想要的包使用我不完全理解的功能。
编辑:
我对函数的理解/认为我理解:
通过调用一个函数,然后在该函数内部传入一个新函数,将多个函数链接在一起:requiresAuth.createResolver
在函数本身内部,我无法弄清楚。
我们得到一个新变量baseResolver,我们将它链接到一个新的createResolver
然后我们递归地调用父函数。
我猜我无法理解这个流程。
【问题讨论】:
-
好吧,我对graphQL不熟悉,但代码只是将
function添加到另一个function -
@appleapple 我以前从未见过这样的语法。这个有名字吗?
-
@CodingLittle 我不确定是否有名称,但基本上你可以像 javascript 中的普通对象一样向函数添加任何内容(例如
{function X(){};X.a=1;console.log(X.a);} -
或
{function X(){};X.a=()=>1;console.log(X.a());} -
cmets 部分变得有点大。对于理解它的人,我能否得到一个答案,它被分解或以更简单的方式编写?我目前正在阅读高阶函数链接,但它仍然没有让我完全清楚地了解函数正在做什么。
标签: javascript graphql apollo-server