简体   繁体   English

通过url和httpRequest解析云代码循环

[英]Parse cloud code loop through url and httpRequest

I just want to do a simple loop in my "alerts" objects, which contains an url, and a word. 我只想在我的“警报”对象中做一个简单的循环,其中包含一个URL和一个单词。 For each alert, I do a httpRequest to check if the word is present in the response html code. 对于每个警报,我都执行一个httpRequest来检查响应html代码中是否存在该单词。 I yes, I put the status to true. 是的,我将状态定为真实。

I also want to update each time the "updatedTo" column, even if I don't find the word in the response html code, but I don't know why... 我也想每次在“ updatedTo”列中进行更新,即使我在响应html代码中找不到该单词,但我也不知道为什么...

I wrote this cloud code, but it don't works, or it works sometimes only if I have only items with the word present. 我写了这个云代码,但是它不起作用,或者有时只有当我只有带有单词的项目时,它才起作用。

    Parse.Cloud.job("updateStatus", function(request, status) {
    Parse.Cloud.useMasterKey();
    var counter = 0;
    var AlertItem = Parse.Object.extend("Alert");
    var query = new Parse.Query(AlertItem);
    query.each(function(alert) {
            var alertTitle = alert.get("title");
            var alertUrl = alert.get("url");
            var alertStatus = alert.get("status");
            var alertWords = alert.get("research");
            console.log("Alert : " + alertTitle + " - Check if : " + alertWords + " is on : " + alertUrl)

            promise = promise.then(function() {
                    return Parse.Cloud.httpRequest({
                        url: alertUrl,
                        headers: {
                            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10) AppleWebKit/600.1.25 (KHTML, like Gecko) Version/8.0 Safari/600.1.25'
                        },
                    }).then(function(httpResponse) {
                            console.log("We succeded to access to the website");
                            var htmlCode = httpResponse.text;
                            if (htmlCode.indexOf(alertWords) >= 0) {
                                if (alertStatus == false) {
                                    alert.set("status", true);
                                    console.log("new status:true");
                                    return alert.save();
                                }
                            } else {
                                alert.set("status", false);
                                console.log("new status:false");
                                //I do this to updated the "updatedTo" field, but it doesn't work
                                return alert.save();
                            }
                            // You need to return a Promise here if non of the above condition meet.
                        },
                        function(error) {
                            console.error('Request failed with response code ' + httpResponse.headers.Location);
                            // You need to return a rejected promise here.
                        }
                    });
            });
        return promise;
    }).then(function() {
    status.success('Status updated');
    // Set the job's success status
}, function(error) {
    // Set the job's error status
    status.error("Uh oh, something went wrong.");
});
});

The query.each(callback, options) from documentation. 文档中的query.each(回调,选项)。

Iterates over each result of a query, calling a callback for each one. 遍历查询的每个结果,为每个查询调用一个回调。 If the callback returns a promise, the iteration will not continue until that promise has been fulfilled. 如果回调函数返回了一个Promise,则直到该Promise满足,迭代才会继续。 If the callback returns a rejected promise, then iteration will stop with that error. 如果回调返回被拒绝的承诺,则迭代将因该错误而停止。 The items are processed in an unspecified order. 这些项目将以未指定的顺序处理。 The query may not have any sort order, and may not use limit or skip. 该查询可能没有任何排序顺序,并且可能不使用限制或跳过。

Parse.Cloud.job("updateStatus", function(request, status) {
    Parse.Cloud.useMasterKey();
    var counter = 0;
    var AlertItem = Parse.Object.extend("Alert");
    var query = new Parse.Query(AlertItem);
    query.each(function(alert) {
        var alertTitle = alert.get("title");
        var alertUrl = alert.get("url");
        var alertStatus = alert.get("status");
        var alertWords = alert.get("research");
        console.log("Alert : " + alertTitle + " - Check if : " + alertWords + " is on : " + alertUrl)


        return Parse.Cloud.httpRequest({
            url: alertUrl,
            headers: {
                'user-agent': 'A user classic agent'
            },
            success: function(httpResponse) {
                console.log("We succeded to access to the website");
                var htmlCode = httpResponse.text;
                if (htmlCode.indexOf(alertWords) >= 0) {
                    if (alertStatus == false) {
                        alert.set("status", true);
                        console.log("new status:true");
                        return alert.save();
                    }
                } else {
                    alert.set("status", false);
                    console.log("new status:false");
                    //I do this to updated the "updatedTo" field, but it doesn't work
                    return alert.save();
                }
                // You need to return a Promise here if non of the above condition meet.
            },
            error: function(httpResponse) {
                console.error('Request failed with response code ' + httpResponse.headers.Location);
                // You need to return a rejected promise here.
            }
        });
    }).then(function() {
        status.success('Status updated');
        // Set the job's success status
    }, function(error) {
        // Set the job's error status
        status.error("Uh oh, something went wrong.");
    });
});

So, with any help it was difficult, but I finish to find another post who was close to what I need, I adapt it, and I success to use it, it works great with Promises :) : 因此,在任何帮助下都很难,但是我最终找到了另一个与我需要的贴近的职位,我对其进行了调整,然后我成功使用了它,它与Promises一起使用非常有用:):

var _ = require('underscore.js')

Parse.Cloud.job("updateStatus", function(request, response) {

var alerts = Parse.Object.extend("Alert");
var query = new Parse.Query(alerts);
query.equalTo("status", false);

query.find().then(function(alerts) {

    var promise = Parse.Promise.as();

    _.each(alerts, function(alert) {

        var alertUrl = alert.get("url");
        ...

        promise = promise.then(function() {
            return Parse.Cloud.httpRequest({
                url: alertUrl
                }).then(function(httpResponse) {
                    ...
                }, 
                function(error) {
                    ...
                });
            });
    });

    return promise;

}).then(function() {
    response.success("All status updated with success !");
}, 
function (error) {
    response.error("Error: " + error.code + " " + error.message);
});
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM