【问题标题】:Promises fail for httprequest in nodejs (Parse.com)节点 js (Parse.com) 中的 http 请求的承诺失败
【发布时间】:2017-05-08 13:24:57
【问题描述】:

我正在尝试在 parse.com 服务器上的 nodejs 中串联实现 3 个 httprequest。我仍在试图弄清楚它是如何工作的。目前,以下代码不会引发语法错误,但也会在服务器日志中返回一个空白的 console.log。非常感谢任何帮助。

Parse.Cloud.define('paypalCheck', function (request, response) {

    Parse.Cloud.httpRequest({ 
        method: 'POST',
        url:url1,
        body:body1
    }).then(function(httpResponse){
        console.log(httpResponse.text.split("\n")[0])

        var promises = [];
        var updated = false;
        if(httpResponse.text.split("\n")[0] == 'FAIL'){
            var orderUpdate = Parse.Cloud.httpRequest({
                method: 'POST',
                            url:url2,
                headers:header2,
                body:body2
            }).then(function(httpResponse) {
                console.log('updated')
                updated = true;
                return 'order updated';
            });
            promises.push(orderUpdate);
        }

        if(updated){
            var orderFetch = Parse.Cloud.httpRequest({
                method: 'GET',
                            url:url3,
                headers:header3
            }).then(function(httpResponse) {
                return_url = httpResponse.data.order.order_status_url
                return httpResponse;
            });
            promises.push(orderFetch);
        }

        return Parse.Promise.when(promises)
    }).then(function(httpResponse){
        console.log('result');
        console.log(httpResponse);
        response.success(return_url)
    }, function(error){
        console.log('result');
        response.error(error)
    })
})

【问题讨论】:

  • 你是说你连result都没有打印出来吗?一个空白console.log 听起来很奇怪。并且并行?您的代码正在按顺序执行请求,因为您正在等待第一个 httpRequesturl1。您想为每个 url 独立运行请求,还是它们在某种程度上相互依赖?
  • 您的 updated 语句看起来很奇怪,因为您在回调中设置它,但在 if 条件中使用它(这表明您要等待更新)。如果是这样,我宁愿在 orderUpdate 请求之上再写一个 then 声明
  • @DanielB.. 我的错误.. 他们应该是连续的.. 我正在编辑这个问题.. 是的.. 这是一个空白的console.log,甚至没有打印result
  • @Icepickle.. 我的错误,电话是串联的.. 一个接一个..
  • @Icepickle 2nd httprequest 应该仅在来自1st httprequest 的响应匹配条件时发生。同样,3rd httprequest 应该在2nd httprequest 上成功运行。3rd httprequest 的响应是返回到前端。

标签: javascript node.js parse-platform promise httprequest


【解决方案1】:

您的代码需要进行一些修改:

Parse.Cloud.define('paypalCheck', function (request, response) {

    Parse.Cloud.httpRequest({ 
        method: 'POST',
        url:url1,
        body:body1
    }).then(function(httpResponse){
        console.log(httpResponse.text.split("\n")[0])

        var promises = [];
        var updated = false;
        if(httpResponse.text.split("\n")[0] == 'FAIL'){
            return Parse.Cloud.httpRequest({
                method: 'POST',
                url:url2,
                headers:header2,
                body:body2
            }).then(function(httpResponse) {
                console.log('updated')
                updated = true;
                return Parse.Cloud.httpRequest({
                    method: 'GET',
                    url:url3,
                    headers:header3
                });
            }).then(function(httpResponse) {
                return_url = httpResponse.data.order.order_status_url
                return httpResponse;
            });;
        }
        else console.log("FAIL was true, do nothing");
    }).then(function(httpResponse){
        console.log('result');
        console.log(httpResponse);
        response.success(return_url)
    }, function(error){
        console.log('result');
        response.error(error)
    })
})

首先,我在您对 httpResponse.text.split 的检查中添加了一个 else 条件,看看它是否成功。

其次,我已经摆脱了您的 Parse.Promise.when() 调用,而是将您发出的请求链接起来,以便它们按顺序正确发生。按照你的方式, if(updated) 永远不会通过,因为检查会在第二个 httpRequest 返回之前发生。

让我知道这是否会改变您的输出。

【讨论】:

  • 它有效.. 我在我的代码中看到了愚蠢.. 而不是 else console.log("FAIL was true, do nothing"); ,如果我想返回错误应该怎么做?我试过else response.error("PayPal failed, do nothing");,但它首先进入then(function(httpResponse){ console.log('result'); console.log(httpResponse); response.success(return_url) }, 部分,然后返回错误。
  • 你可以返回一个被拒绝的 promise (return Parse.Promise.error("Error message");),或者返回一个 Parse.Error (return Parse.Error(code, message); 其中 code 是你选择的三位数 http 代码。
  • 注意:您只能调用一次 response.error/success。而且您的代码将继续执行,并且在第二次调用时会出错。有了 Promise,不返回任何东西都会返回一个已解决的空 Promise。返回除了被拒绝的 Promise 或 Parse.Error 之外的任何内容都将返回带有值的已解决的 Promise。返回被拒绝的承诺或 Parse.Error 将作为被拒绝的承诺返回。即使您调用了 response.success/error,Promise 链也将始终继续执行。没有错误处理程序的.then() 将被拒绝的承诺跳过,错误传递到
  • 链直到找到错误处理程序。你必须在这里小心。当我开始时,我有一个带有成功和错误处理程序的 .then(),在错误处理程序中称为 response.error() ,但如果你没有专门返回错误/拒绝,即使这样也会返回一个已解决的承诺来自错误处理程序的承诺。它们可能很棘手,但一旦你弄清楚它们就会非常强大。
【解决方案2】:

我觉得问题是,你没有声明return_url var。

在这一行中使用了return_url = httpResponse.data.order.order_status_url,但我没有看到声明。

当您没有声明应用程序崩溃的变量并且您不会收到错误时,只有停止工作。

同时尝试在你的 Promise 中实现 catch 子句,这可能会帮助你调试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-17
    • 2018-09-26
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2017-04-10
    • 2013-12-02
    • 2020-09-13
    相关资源
    最近更新 更多