如何正确调用另一个函数返回对象中的嵌套函数?
错误信息
TypeError: adminSdk.InsertGameAuthRefreshTokens is not a function at insertGameAuthRefreshTokens (D:\Projects\CHRIS\vsm-nft-fe\.next\server\pages\api\gameAuthCallback.js:1496:20) at handler (D:\Projects\CHRIS\vsm-nft-fe\.next\server\pages\api\gameAuthCallback.js:1434:26) at runMicrotasks (<anonymous>) at processTicksAndRejections (internal/process/task_queues.js:95:5) at async Object.apiResolver (D:\Projects\CHRIS\vsm-nft-fe\node_modules\next\dist\server\api-utils.js:114:13) at async DevServer.handleApiRequest (D:\Projects\CHRIS\vsm-nft-fe\node_modules\next\dist\server\next-server.js:763:9) at async Object.fn (D:\Projects\CHRIS\vsm-nft-fe\node_modules\next\dist\server\next-server.js:654:37) at async Router.execute (D:\Projects\CHRIS\vsm-nft-fe\node_modules\next\dist\server\router.js:206:32) at async DevServer.run (D:\Projects\CHRIS\vsm-nft-fe\node_modules\next\dist\server\next-server.js:831:29) at async DevServer.handleRequest (D:\Projects\CHRIS\vsm-nft-fe\node_modules\next\dist\server\next-server.js:295:20)
问题代码
目标函数所在代码(HasuraAdapter内部)
const adminSdk = getAdminSdk({ endpoint, adminSecret, }) return { async funcName(data) { const { graphql_mutation_name: response } = adminSdk.generatedFuncName({ data }) return { userId: response.user_id, } }, }
(注:实际代码中funcName对应insertGameAuthRefreshTokens,generatedFuncName对应InsertGameAuthRefreshTokens)
调用代码
const sdk = HasuraAdapter(args) const { funcName} = sdk const response = await funcName(data) console.log(response)
正确访问及问题排查
你的调用方式本身是正确的——通过HasuraAdapter获取返回对象,解构出目标函数并调用的逻辑没问题。报错的核心是adminSdk里的InsertGameAuthRefreshTokens不存在,按以下步骤排查修复:
确认SDK生成的方法名
Hasura自动生成的SDK方法名通常是小驼峰格式(比如insertGameAuthRefreshTokens而非InsertGameAuthRefreshTokens),检查是否是大小写或拼写错误。可以在HasuraAdapter内部打印adminSdk的结构,确认实际存在的方法:const adminSdk = getAdminSdk({ endpoint, adminSecret }) console.log(Object.keys(adminSdk)) // 打印所有可用方法名验证getAdminSdk的参数有效性
如果传入的endpoint或adminSecret不正确(比如地址错误、密钥无效),生成的adminSdk可能不包含预期的mutation方法。检查这两个参数是否和Hasura控制台配置一致。确认Hasura元数据中存在对应Mutation
登录Hasura控制台,检查是否已经创建了对应的业务mutation操作,且该mutation已被正确生成到SDK中。如果mutation不存在,需要先创建并重新生成SDK。确保SDK是最新版本
如果Hasura元数据有更新,需要重新生成SDK文件,避免使用旧版本的SDK导致方法缺失。
内容的提问来源于stack exchange,提问作者Ahirwe Mugisha Tresor

