JavaScript 循环以容纳从 webhook 接收到的过滤对象数组

医生

目标

捕获通过 webhook 发送的每个事件并将其转换为 Slack 帖子。事件包括在线社区中发布的新博客帖子、问题、讨论、维基页面等(限定为contents)和评论(限定为comments)。有时在 webhook 中一次发送多个事件

尝试的方法

这个简单的 JavaScript Azure 函数旨在

  • 接收一个或多个以 JSON 数组发送的 webhook 事件
  • contents从那些符合条件的对象中过滤符合条件的对象comments
  • 为每个content和/或comment对象发送 API 请求(两者都有自己的 URL 端点)
  • 解析返回的每个对象(contentscomments返回相似但不同的键层次结构)
  • 将值组合成 JSON 对象(每个事件一个,无论是 acontent还是comment)并发送到 Slack

结果

以下代码适用于单个webhook 事件,直到我尝试添加for循环以容纳在一个数组中发送的多个webhook 事件。

代码

来自 webhook 的 JSON 示例

{
    "events": [{
            "TypeId": "9999-999e",
            "DateOccurred": "2018-12-15T20:39:42.2487557Z",
            "EventData": {
                "ActorUserId": 1234,
                "ContentId": "5678-999c",
                "ContentTypeId": "9012-999d",
                "WikiPageId": 3456,
                "WikiId": 1
            }
        },
        {
            "TypeId": "1111-111f",
            "DateOccurred": "2018-12-15T22:55:37.7846546Z",
            "EventData": {
                "ActorUserId": 2345,
                "ContentId": "2222-222b",
                "ContentTypeId": "3333-333a",
                "ForumReplyId": 4567,
                "ForumThreadId": 8901,
                "ForumId": 2
            }
        },
        {
            "TypeId": "9012-888f",
            "DateOccurred": "2018-12-15T22:44:57.7091846Z",
            "EventData": {
                "ActorUserId": 9876,
                "CommentId": "8900-123a"
            }
        }
    ]
}

API 请求返回的 JSON 示例

层次结构中略有不同的结构是准确的。

(内容)

{
    "Content": {
        "CreatedByUser": {
            "ProfileUrl": "https://<company>.telligenthosting.net/members/<user>",
            "Username": "<user>"
        },
        "HtmlName": "Title",
        "HtmlDescription": "Text",
        "Url": "https://<company>.telligenthosting.net/<link>"
    }
}

(评论)

{
    "Comment": {
        "Content": {
            "CreatedByUser": {
                "ProfileUrl": "https://<company>.telligenthosting.net/members/<user>",
                "Username": "<user>"
            },
            "HtmlName": "Title",
            "HtmlDescription": "Text",
            "Url": "https://<company>.telligenthosting.net/<link>"
        }
    }
}

JavaScript 文件(作为 Azure 函数)

module.exports = function (context, data) {
    var json = data.body;

    var request = require('request');

    // Parse the webhook event JSON body

    var unparsed = JSON.stringify(json.events);
    var parsed = JSON.parse(unparsed);

    console.log(parsed) // RESULTS ARE AS EXPECTED (the JSON nested beneath `events`, beginning and ending with `[]`)

    for (var i = 0; i < parsed.length; i++) {

        // Parse out Id of webhook event (for all content types but comments)

        // This Id retrieves details about the content

        var ContentId, ContentTypeId;
        if (parsed[i].EventData.hasOwnProperty('ContentId')) {

            var ContentId = parsed[i].EventData.ContentId;
            var ContentTypeId = parsed[i].EventData.ContentTypeId;

            console.log(ContentTypeId); // RESULTS ARE NOT AS EXPECTED: Prints the same Id twice

            var options = {
                url: "https://<company>.telligenthosting.net/api.ashx/v2/genericcontent/" + ContentId + "/" + ContentTypeId + ".json",
                headers: {
                    "Rest-User-Token": "<token>",
                    "Content-Type": "application/json"
                }
            };
        };

        // Parse out Id of a webhook event (for comments only)

        // This Id retrieves details about a comment    

        var CommentId;
        if (parsed[i].EventData.hasOwnProperty('CommentId')) {

            var CommentId = parsed[i].EventData.CommentId;

            var options = {
                url: "https://<company>.telligenthosting.net/api.ashx/v2/comments/" + CommentId + ".json",
                headers: {
                    "Rest-User-Token": "<token>",
                    "Content-Type": "application/json"
                }
            };
        };

        function callback(error, response, body) {
            if (!error && response.statusCode == 200) {
                var info = JSON.parse(body);

                //For all content types but comments

                var username, profileUrl, subject, url, text;
                if (info.hasOwnProperty('Content')) {

                    username = info.Content.CreatedByUser.Username;
                    profileUrl = info.Content.CreatedByUser.ProfileUrl;
                    subject = info.Content.HtmlName;
                    url = info.Content.Url;
                    text = info.Content.HtmlDescription;
                };

                //For comments

                if (info.hasOwnProperty('Comment')) {

                    username = info.Comment.User.DisplayName;
                    profileUrl = info.Comment.User.ProfileUrl;
                    subject = info.Comment.Content.HtmlName;
                    url = info.Comment.Url;
                    text = info.Comment.Body;
                };
            };

            //Send to Slack

            function sendToSlack(theUsername, theIconEmoji) {

                var theUsername = "Bot";
                var theIconEmoji = ":bot:";

                var payload = {
                    attachments: [{
                        author_name: username,
                        author_link: profileUrl,
                        title: subject,
                        title_link: url,
                        text: text
                    }]
                };
                if (theUsername !== undefined) {
                    payload.username = theUsername;
                }
                if (theIconEmoji !== undefined) {
                    payload.icon_emoji = theIconEmoji;
                }
                var theRequest = {
                    url: urlWebHook,
                    method: "POST",
                    json: payload
                };
                request(theRequest, function (error, response, body) {});
            }

            var urlWebHook = "https://hooks.slack.com/services/<Id>";

            sendToSlack();
        };
    };
    request(options, callback);
};

问题

正如上面代码中所注释的那样,循环似乎不是通过每个事件,而是多次通过第一个事件。

我读到的大部分内容都表明for (var i = 0; i < json.length; i++) {是正确的方法,但无论我尝试什么,Azure 函数都会抛出 a500 Internal Service Error并最终超时。即使打开了详细日志记录,调试控制台中也不提供任何信息。

谢谢

感谢您的任何建议或教育。

贝纳斯

EventData 未定义,因为您没有正确构建您的对象。

您可以这样做:

var json = require("./test.json");

var unparsedEvents = json.events;
for (let event of unparsedEvents) {
    var ContentId = event.EventData.ContentId;
    var ContentTypeId = event.EventData.ContentTypeId;
    var CommentId = event.EventData.CommentId;
    var options = new Object();

    console.log("ContentId:", ContentId);
    console.log("ContentTypeId:", ContentTypeId);
    console.log("CommentId:", CommentId);

    if (CommentId) {
        options.url = "https://<company>.telligenthosting.net/api.ashx/v2/comments/" + CommentId + ".json";
        options.headers = {
            "Rest-User-Token": "<token>",
            "Content-Type": "application/json",
        };
    } else {
        options.url = "https://<company>.telligenthosting.net/api.ashx/v2/genericcontent/" + ContentId + "/" + ContentTypeId + ".json";
        options.headers = {
            "Rest-User-Token": "<token>",
            "Content-Type": "application/json",
        };
    }

    console.log("options:", options);
    console.log();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Javascript:过滤对象数组

来自分类Dev

数组循环中的Javascript对象

来自分类Dev

使用javascript循环对象数组

来自分类Dev

在 JavaScript 中循环对象数组

来自分类Dev

收到Webhook后等待

来自分类Dev

通过JavaScript中的非数组平面JSON对象过滤和循环

来自分类Dev

从Mandrill Webhook接收到无效的JSON字符串

来自分类Dev

使用javascript过滤对象数组

来自分类Dev

VB.NET接收Webhook

来自分类Dev

未收到Paypal Webhook事件

来自分类Dev

未收到Paypal Webhook事件

来自分类Dev

JavaScript中的输出对象数组循环

来自分类Dev

在JavaScript中的数组中循环遍历对象

来自分类Dev

Javascript 循环遍历 JSON 对象数组

来自分类Dev

在 JavaScript 中使用 for 循环创建对象数组

来自分类Dev

根据多值对象过滤JavaScript对象数组

来自分类Dev

过滤Javascript中对象内部的对象数组

来自分类Dev

javascript过滤数组内部对象中的数组

来自分类Dev

javascript对象上的for循环

来自分类Dev

循环对象javascript

来自分类Dev

循环访问 JavaScript 对象

来自分类Dev

在Javascript数组中循环

来自分类Dev

JavaScript JQuery数组循环

来自分类Dev

循环数组的JavaScript

来自分类Dev

数组循环javascript

来自分类Dev

JavaScript中的数组循环

来自分类Dev

根据在 Javascript 中的 for 循环中生成的值过滤对象

来自分类Dev

javascript在数组过滤器内嵌套for循环

来自分类Dev

javascript在数组过滤器内嵌套for循环