两次 httpRequest 后解析、saveAll 失败(Cloud Code 作业)

Parse, saveAll failing after two httpRequests (Cloud Code job)

我是运行从事以下工作

有一次我只执行了一个执行 saveAll 并且有效的 httpRequest。

添加第二个 httpRequest 后,saveAll 停止工作

我读过一些关于“每个 job/function 的 2 个查询/httpRequests”的轶事,然后我读了一些关于 Promises 的其他轶事,以及一些关于链接承诺的轶事,但在这一点上我我迷路了

所以我重写了这个作业以使用 Promises 但我在 saveAll 方法中仍然遇到错误

Parse.Cloud.job("myJob", function(request, status) {

Parse.Cloud.httpRequest({
    method: "GET",
    url: "https://api.website.com/api/method",
    headers: {
        "Content-Type": "application/json"
    }
}).then(function(httpResponse)
    /*,success: function(httpResponse)*/
    {

        var symbols = httpResponse.data["symbols"];

        var tickerNames = new Array();

        symbols.forEach(function(obj) {

            tickerNames.push(obj.symbol);
            //maybe do a before save method to check if it already exists               

        });

        return tickerNames;
    }).then(function(tickerNames) {

    return Parse.Cloud.httpRequest({
        method: "GET",
        url: "https://api.secondsite.org/api/" + tickerNames.join(","),
        headers: {
            "Authorization": "Bearer ACCESSTOKEN",
            "Accept": "application/json"
        }
        /*,
                            success: function(httpResponse) {*/
    }).then(function(httpResponse) {

            var serverObjects = new Array();

            var objectArray = httpResponse.data["quotes"]["quote"];
            objectArray.forEach(function(obj) {

                var SocialPicks = Parse.Object.extend("SocialPicks");
                var newPick = new SocialPicks();
                newPick.set("symbol", obj.symbol);
                newPick.set("title", obj.description);
                newPick.set("changePercent", obj.change_percentage);
                newPick.set("volume", obj.volume);
                newPick.set("avgVolume", obj.average_volume);

                //newPick.save();

                serverObjects.push(newPick);

            });

            //console.log(serverObjects[0].symbol);

            var promise = Parse.Promise.as();

            promise = promise.then(function(){
                return Parse.Object.saveAll(serverObjects)
                .then(function(list) {

                    console.log("saveAll success");
                    status.success("success");

                }, function(error) {
                    console.log("saveAll error");
                    status.error("not successful saving");
                });
            })

            return promise;

        },
        /*error: function(error) {*/
        function(httpResponse) {
            console.log("ERROR");
            status.error("not successful network call");
        }
    );

});

  });

无论我使用 promises 还是不使用 promises

的此方法的顺序版本,这总是因 status.error("not successful saving"); 而失败

此时我不确定我是否遇到了解析限制,或者我是否错误地使用了 promises,或者两者兼而有之,或者其他

因此,如果任何人有在 Cloud Code 中执行后续 httpRequests 然后编写对象的经验,洞察力将会有所帮助

为了它的价值,这是我对代码的简化。

我完成了三个主要模组:

  • 在两个地方使用了array.map()来构建tickerNamesserverObjects
  • 取消嵌套 serverObjects/saveall() 例程以将其放入外部承诺链。
  • 清除了不必要的 Parse.Promise.as()
Parse.Cloud.job("myJob", function(request, status) {
    Parse.Cloud.httpRequest({
        method: 'GET',
        url: 'https://api.website.com/api/method',
        headers: {
            'Content-Type': 'application/json'
        }
    }).then(function(httpResponse) {
        var tickerNames = httpResponse.data.symbols.map(function(obj) {
            return obj.symbol;
            //maybe do a before save method to check if it already exists
        });
        return Parse.Cloud.httpRequest({
            method: 'GET',
            url: 'https://api.secondsite.org/api/' + tickerNames.join(),
            headers: {
                'Authorization': 'Bearer ACCESSTOKEN',
                'Accept': 'application/json'
            }
        });
    }).then(function(httpResponse) {
        var serverObjects = httpResponse.data.quotes.quote.map(function(obj) {
            var SocialPicks = Parse.Object.extend("SocialPicks");
            var newPick = new SocialPicks();
            newPick.set('symbol', obj.symbol);
            newPick.set('title', obj.description);
            newPick.set('changePercent', obj.change_percentage);
            newPick.set('volume', obj.volume);
            newPick.set('avgVolume', obj.average_volume);
            return newPick;
        });
        return Parse.Object.saveAll(serverObjects).then(function(list) {
            console.log('saveAll success');
            status.success('success');
        }, function(error) {
            console.log('saveAll error: ' + error.message);
            status.error('not successful saving');
        });
    }, function(httpResponse) {
        console.log('ERROR: ' + error.message);
        status.error('not successful network call');
    });
});

请注意,这并不能解决所报告的错误,我们现在知道它存在于其他地方,但可能在其他方面有所帮助。

原来这是由于 API 服务器之一的类型错误导致的错误。

它提供了一个整数,而我的模型正在寻找该变量的字符串

在离开这个问题一段时间后,我意识到我并没有打印出该方法试图告诉我的实际错误。打印出来,在控制台看到问题,解决了问题。

引述色情示范