Azure 函数:在异步函数中使用 Apollo Azure 处理程序

Posted

技术标签:

【中文标题】Azure 函数:在异步函数中使用 Apollo Azure 处理程序【英文标题】:Azure functions: Use Apollo Azure handler in async function 【发布时间】:2020-10-14 19:24:00 【问题描述】:

我想将我的 apollo 处理程序包装到一个异步函数中,以便在执行处理程序函数之前执行一些检查。一切正常,当我不使用异步函数但将函数导出为异步时,总是返回一个空响应。

functions.json


  "bindings": [
    
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    ,
    
      "type": "http",
      "direction": "out",
      "name": "$return"
    
  ],
  "scriptFile": "../dist/graphql/index.js"

设置:

    import  buildSchema  from 'type-graphql';
    import  ApolloServer  from 'apollo-server-azure-functions';
    import  Context, HttpRequest  from '@azure/functions';
    
    import  resolvers  from '../src/graphql';
    import  authChecker  from '../src/auth';
    
    const schema = buildSchema(
      resolvers,
      authChecker,
    );
    
    const server = new ApolloServer(
      schema,
      context: ( context ) => context, // directly use azure Context as Apollo context,
    );
    
    const handler = server.createHandler();

这行得通

export default (context: Context, request: HttpRequest) => 
  handler(context, request);
;

这总是返回 204,空响应

export default async (context: Context, request: HttpRequest) => 
  // do async stuff: await ... 

  handler(context, request);
;

【问题讨论】:

【参考方案1】:

有两种方法可以从 Node.js Azure 函数返回数据:

returning data 来自 async 函数 将数据传递给context.done() 方法

在您的代码中,handler 是来自 apollo-server-azure-functions 包的方法。它在内部调用 context.done() 将响应发送回 Azure 运行时。

但因为handler(context, request) 本身是一个常规函数调用,所以您导出的***async 函数无需等待其完成即可解析。

您可能希望从异步函数返回一个 Promise,该函数将在底层 apollo 服务器准备好发送响应时解析。这是example implementation。

【讨论】:

以上是关于Azure 函数:在异步函数中使用 Apollo Azure 处理程序的主要内容,如果未能解决你的问题,请参考以下文章

Azure 应用服务Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题

Azure Functions 中的孤立异步任务

使用“apollo-server-azure-functions”的 Apollo 订阅

将 JSON 对象映射到 Azure 函数 API 请求类参数中的类

如何在 onError 回调中使用异步错误处理程序?

顺序处理算法/模式 - Azure 服务总线队列