当前位置: 首页 > 知识库问答 >
问题:

如何编写Azure HTTP触发器函数,将其传入消息的一部分传递给服务总线队列?

能正青
2023-03-14

我正在设置一些Azure HTTP触发器函数来接收JSON数据。

我想访问将一些数据向前传递到服务总线队列以进行下游处理。

我已能够将出站绑定添加到服务总线,但无法放置代码以从 HTTp 触发器函数将消息放在队列上,而不会收到 500 内部服务器错误。这是由于函数的异步性质造成的吗?

如何实现调用 HTTP 触发器将数据传递到服务 B 总线队列的功能?

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    if (req.query.name || (req.body && req.body.name)) {

        context.log('Incoming data from Webhook' + req);
        context.bindings.outputSbMsg = "Message placed on Service Bus Queue";
        context.log('Message placed on Service Bus Queue');

        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello " + (req.query.name || req.body.name)
        };
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
};

我确实像您一样尝试了部署,但不幸的是,即使只是在运行get查询时,我仍然会遇到500内部服务器错误。

以下是文件在Monent的样子:

函数. json

  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
      "type": "serviceBus",
      "direction": "out",
      "connection": "iotcwebhookdispatchersbns_SERVICEBUS",
      "name": "outboundSBQMsg",
      "queueName": "observations-sbq"
    }
  ]
}

索引.js

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');
    var message = "This is a test SBQ message - from an Azure function!";
    context.bindings.outboundSBQMsg = message;
    context.res = {
        status: 200,
        body: "This code is to send message to service bus."
    };
};

本地设置. json文件

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "iotcwebhookdispatchersbns_SERVICEBUS": "Endpoint=sb://iotc-webhook-dispatcher-sbns.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=MiIv52YQ6plMVt35vPvx9U5DmsQbTvUXamaeZ/fA2Eg="
  }
}

在配置出站服务总线队列时,我发现奇怪的是,我可以从现有命名空间中选择服务总线队列命名空间。我不能在下一步选择实际的队列,即使之前已经创建了观察值sbq。

输入其他一些队列名称,例如test队列,也不起作用。它没有创建并且发生相同的500内部服务器错误,即使直接在门户中测试该函数也是如此。

错误消息

这是否意味着尚未使用/部署 local.settings.json 文件?

日志文件摘录:

2020-08-28T07:03:46.194 [信息] JavaScript HTTP触发器函数处理了一个请求。2020-08-28T07:03:46.249 [错误] 执行 'Functions.iotc-webhook-dispatcher' (Failed, Id=e248ae01-7a82-485e-bcfe-00ebee6496e0, Duration=14ms) Microsoft Azure WebJobs SDK ServiceBus 连接字符串 'iotcwebhookdispatchersbns_SERVICEBUS' 丢失或为空。2020-08-28T07:07:08.256 [信息] 正在执行 'Functions.iotc-webhook-dispatcher' (Reason='此函数是通过主机 API 以编程方式调用的。', Id=222a675f-8b16-4720-b807-bcc9834d7ddc) 2020-08-28T07:07:08.818 [信息] JavaScript HTTP 触发函数处理了一个请求。2020-08-28T07:07:10.107 [错误] 执行 'Functions.iotc-webhook-dispatcher' (失败, Id=222a675f-8b16-4720-b807-bcc9834d7ddc, Duration=1067ms) Microsoft Azure WebJobs SDK ServiceBus 连接字符串 'iotcwebhookdispatchersbns_SERVICEBUS' 丢失或为空。

共有1个答案

司马腾
2023-03-14

下面的代码在我这边运行良好:

函数. json

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
        "name": "outputSbQueue",
        "type": "serviceBus",
        "queueName": "testqueue",
        "connection": "str",
        "direction": "out"
    }
  ]
}

索引.js

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');
    var message = "This is a test message.";
    context.bindings.outputSbQueue = message;
    context.res = {
        status: 200,
        body: "This code is to send message to service bus."
    };
};

local.settings.json

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "str":"Endpoint=sb://testbowman.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xxxxxx="
  }
}

然后,你会发现一条消息进入服务总线队列:

 类似资料:
  • 我试图按照文档从Azure函数(https://docs.microsoft.com/en-us/Azure/azure-functions/functions-bindings-service-bus-output?tabs=csharp)向Azure服务总线队列写入消息。 我从HTTP触发器的“file->new project”开始,并添加了绑定: 我的host.json和local.set

  • 在.NET core 2.0中使用创建时,我遇到了一个问题。 在体系结构中,当在用于创建用户的队列中创建新消息时,服务必须接收该消息并根据其中的信息在数据库中创建用户。 在Visual Studio2017中,我在下创建了一个新项目。 这种的正确实现是什么?在GitHub上有什么例子吗?提前道谢。

  • 创建了Azure函数,该函数是在Visual Studio中触发并从Visual Studio发布到Azure的服务总线。 每当消息进入队列时,手动运行时,该函数在本地正常运行。但我们的期望是,当消息在队列中时,函数应该自动触发。 我只是手动添加一条新消息,并查看日志,如果函数被自动触发,但它不是。当我检查应用程序洞察时,我发现下面的错误日志 函数“ProcessVideos”的侦听器无法启动。服

  • 我写了C#程序,发送消息到Azure服务总线队列,这是正常工作。现在,我需要通过Azure函数将服务总线队列中收到的消息传递到数据湖,但据我所知,Azure函数不支持数据湖的绑定/触发器。是否有任何方法触发到Azure Data Lake的服务总线队列消息?提前感谢。

  • 我有一个组件,我在其中传递我想要在模态中显示的内容,如下所示: 模态服务如下所示: 在我的popupComponent我有: 现在一切都很好,但是我现在想做的是将一个函数传递给我的服务,以便它使用它。像这样的事情,但我不知道怎么做:

  • 我一直在尝试为Azure函数实现DI,其中函数由ServiceBus触发(本例中为主题/订阅): 我在以下网站上阅读了有关Azure Functions和DI的信息: https://mcguirev10.com/2018/04/03/service-locator-azure-functions-v2.html https://blog.wille-zone.de/post/azure-func